結論
99.99%の四角形分割は、三角形分割で代替できる
絶対に四角形テッセレーションが必要になるのは、この"分割形状"が重要な場合だけです。それは例えば「正方形のメッシュを作成し、それを凸凹させたい」という、幾何学的で特殊なケースだけです。
4辺からなる3D図形の内部を補完したいというだけであれば、三角形テッセレーションを二回することで代替できます
→ ツールが三角形分割しかできないことは、気にしなくていい
今まで私は、独自の四角形分割を実装するため、使用ツールの決定時に、シェーダーが四角形分割テッセレーションをできるかどうか見ていました。しかし多少凝った実装をするにしても、四角形分割は必須ではありません。
Quad用のTessCoordさえ分かればいい
三角形分割では、分割後の頂点座標の計算のために、TessCoordがvector2ではなくvector3で与えられます。これは以下の図のように三角形の重心座標です。
重心座標から三角形上の座標を計算する場合は、次のコードのvalueに、三角形の3つの頂点座標を代入します。
vec3 accum = vec3(0.0f) accum += gl_TessCoord[0] * value[0] accum += gl_TessCoord[1] * value[1] accum += gl_TessCoord[2] * value[2]
で、四角形を2つの三角形に分割してレンダリングする場合は、今分割している三角形の3頂点の、Quadテッセレーションの座標(下図参照) をvalueにしてやればいいんです。
つまり
vec2 quad_TessCoord = vec2(0.0f)
quad_TessCoord += gl_TessCoord[0] * (0,0)
quad_TessCoord += gl_TessCoord[1] * (0,1)
quad_TessCoord += gl_TessCoord[2] * (1,0)
または
vec2 quad_TessCoord = vec2(0.0f)
quad_TessCoord += gl_TessCoord[0] * (1,1)
quad_TessCoord += gl_TessCoord[1] * (1,0)
quad_TessCoord += gl_TessCoord[2] * (0,1)
でQuad用のTessCoordに変換できるってわけです。
※ この順番かどうかはわからないので注意してください