0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

そのテッセレーション、絶対に四角形じゃないとだめ?

Last updated at Posted at 2025-06-09

結論

99.99%の四角形分割は、三角形分割で代替できる

絶対に四角形テッセレーションが必要になるのは、この"分割形状"が重要な場合だけです。それは例えば「正方形のメッシュを作成し、それを凸凹させたい」という、幾何学的で特殊なケースだけです。

image.png
4辺からなる3D図形の内部を補完したいというだけであれば、三角形テッセレーションを二回することで代替できます

→ ツールが三角形分割しかできないことは、気にしなくていい

今まで私は、独自の四角形分割を実装するため、使用ツールの決定時に、シェーダーが四角形分割テッセレーションをできるかどうか見ていました。しかし多少凝った実装をするにしても、四角形分割は必須ではありません。

Quad用のTessCoordさえ分かればいい

三角形分割では、分割後の頂点座標の計算のために、TessCoordがvector2ではなくvector3で与えられます。これは以下の図のように三角形の重心座標です。
image2.png

重心座標から三角形上の座標を計算する場合は、次のコードの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] 

OpenGL Wiki

で、四角形を2つの三角形に分割してレンダリングする場合は、今分割している三角形の3頂点の、Quadテッセレーションの座標(下図参照) をvalueにしてやればいいんです。
image3.png

つまり

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に変換できるってわけです。
※ この順番かどうかはわからないので注意してください

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?