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