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
。フラットシェーディングで面ごとに2つの三角形でレンダリングされた立方体の場合(法線は面ごとに異なるため、異なる面間で頂点を共有できないことを意味するため重要です)、インデックスのバッファを送信します[0.. 36) (6 つの辺 * 2 つの三角形 * それぞれ 3 つの頂点)。
これは、英雄的な努力なしに効率的に可能でしょうか?
WebGL は基本的に OpenGL ES 2.0 であるため、ジオメトリ シェーダーはありません。