0

我在 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,所以没有几何着色器。

4

1 回答 1

0

当然,这是可能的……但是可能不切实际。

您不能生成顶点,但您至少可以使用顶点着色器在程序上用值填充它们。一种方法可能是使用 FBO 并计算片段着色器中的位置,然后使用顶点着色器使用纹理查找来获取位置/法线/uv。这是您能做的最好的事情,因为 OpenGL ES 2.0 缺少持久存储数据的转换反馈。

但是,如果您只生成一次这些多面体,那么一开始就没有动力将负载转移到 GPU 上。WebGL 可以在各种各样的设备上运行,有些设备的吞吐量比其他设备高。但在所有情况下,从顶点缓冲区读取顶点位置都比纹理查找要快。如果 WebGL 有转换反馈,我可能会提出其他建议,但这听起来像是在浪费时间。

于 2013-09-08T22:03:06.073 回答