我正在用WebGL渲染多面体,我想知道是否有一种更有效、更不容易出错的方法来生成顶点位置和法线。
理想情况下,我会向GPU发送一个只包含索引的缓冲区,并在顶点着色器中计算每个顶点的位置和法线。顶点着色器的外观如下所示:
uniform mat4 transform;
uniform ??? polyhedra; // some kind of representation of the polyhedra type
attribute int index;
varying vec4 normal;
varying vec2 uv;
vec3 calculatePosition() { /* mathemagic w/index and polyhedra */ };
vec3 calculateNormal () { /* mathemagic w/index and polyhedra */ };
vev2 calculateUV () { /* mathemagic w/index and polyhedra */ };
void main() {
gl_Position = transform * vec4(calculatePosition(), 1.0);
normal = transform * vec4(calculateNormal(), 1.0);
uv = calculateUV();
}然后将顶点索引数组发送给index。对于使用平面着色的每个面两个三角形渲染的立方体(这很重要,因为这意味着顶点不能在不同的面之间共享,因为每个面的法线是不同的),我会发送一个索引缓冲区[0..36) (6个边*2个三角形*3个顶点)。
这是否有可能在没有英雄般的努力的情况下有效地实现?
WebGL本质上是OpenGL ES 2.0,因此没有几何体着色器。
发布于 2013-09-09 06:03:06
当然,这是可能的.然而,这可能并不实用。
不能生成顶点,但至少可以使用顶点着色器按程序使用值填充它们。一种方法可能是使用FBO并计算片段着色器中的位置,然后使用顶点着色器通过纹理查找获取位置/法线/uv。这是您能做的最好的事情,因为OpenGL ES 2.0缺乏转换反馈来持久地存储数据。
然而,如果你只生成这些多面体一次,就没有什么动力将负载转移到GPU上。WebGL可以在各种各样的设备上运行,其中一些设备的吞吐量比其他设备高。但在所有情况下,从顶点缓冲区读取顶点位置都比纹理查找快。如果WebGL有转换反馈,我可能会提出不同的建议,但这听起来像是巨大的时间浪费。
https://stackoverflow.com/questions/18680884
复制相似问题