TriangleStripとは #
🔗DirectXや🔗OpenGL、🔗VulkanなどのグラフィックスAPI、ライブラリでゲームのキャラクターや物体を描く際には、頂点と(必要であれば)テクスチャをGPUに渡す必要がある。
この場合、頂点とは3D空間上の点の事だ。
頂点と頂点を繋げることによって線や三角形(場合によっては他の図形もある)を描くことができる。
そうして描かれる小さな三角形を組み合わせることで、ゲームの人形キャラクターや足場などの複雑なオブジェクトを描くことができる。
GPUでは頂点の集まりをどのように処理(描画)するか指定することができる。
処理のオプションは頂点モードなどと呼ばれる。(はず)
頂点モード #
いくつかの一般的な頂点モードを図を用いて説明しておく。
Point List #
点の集まり。
GPUに頂点1 2 3 4 5
を渡すとそのまま5つの点が描かれる。
Line List #
線の集まり。 2つの頂点で1つの線が描かれる。
GPUに頂点1 2 3 4 5 6
を渡すと、線1 2
, 3 4
, 5 6
が描かれる。
Line Strip #
GPUに頂点1 2 3 4 5
を渡すと、線1 2
, 2 3
, 3 4
, 4 5
が描かれる。
Triangle List #
三角形の集まり。
3つの頂点で1つの三角形が描かれる。
GPUに頂点1 2 3 4 5 6
を渡すと、三角形1 2 3
, 4 5 6
が描かれる。
Triangle Strip #
GPUに頂点1 2 3 4 5 6
を渡すと、三角形1 2 3
, 2 3 4
, 3 4 5
, 4 5 6
が描かれる。
特に興味深いのはTriangle Stripだろう。 Triangle Listでは6つの頂点で2つの三角形しか描けないが、Triangle Stripでは6つの頂点で4つの三角形を描ける。
もちろん三角形が辺で繋がっていないといけないという制約はあるが、頂点数を削減することができる。
物体が複雑になって頂点数が多くなるほど負荷が増えるので頂点数を削減することはパフォーマンス上重要である。
TriangleStripでキューブを描く #
以下の方法を参考に、Triangle Stripでキューブ(直方体)を描く。
Cube using single GL_TRIANGLE_STRIP: 🔗https://stackoverflow.com/questions/28375338/cube-using-single-gl-triangle-strip
Optimizing Triangle Strips for Fast Rendering: 🔗http://www.cs.umd.edu/gvil/papers/av_ts.pdf
以下が上のリンク先の図を立体にしたもの。
実際に図の順番で頂点を渡すと正しくキューブを描くことができた。
追記(2024-12-03) #
出来上がる三角形はCw,Ccwが交互に入れ替わるのでFillする場合は裏表を無視するようにするか、別の方法を利用する必要がある。
\(3 \cdot 12 = 36\)頂点で12枚の三角形で描くのは流石に非効率的なので、TriangleStripからTriangleListに変えた。
頂点数は\(8\)のままでちょっとindexバッファがでかくなるぐらいだ。
degenerate triangleやprimitive restartが考えられるが、汚いのでやめておくことにした。(後者でうまくできるか考えたが分からなかった。 多分無理かな)
感想 #
自分の作っているものは頂点数的にめちゃくちゃシンプルなのでぶっちゃけ三角形を12枚で直方体を描いても良いのだが、まあこれも勉強だ。