今更ながらに ComputeShader でも触っておくかと思い、何がしたいのか考えを巡らせた挙げ句、 GeometoryShader みたいなことがしたかったというあんまり面白くない結論に達した。
Graphics.DrawProcedural()
かなー?と思い、ググって漁ったが、思ったような解説が無かったので少し苦労した。みんな、「インスタンシングで大量表示!物量!」がやりたいみたいで、自分の目的とはちょっと違ったのだ。
自分がやりたかったのは、
- 位置のみ渡す
- ComputeShader でその点を中心としたポリゴンを生成
- 描画
というような、先ほども書いたように GeometoryShader なんである。
まずは、スクリプト。
1 | using System.Collections; |
- 点が一つだけ入る ComputeBuffer と、計算後の点が三つ入る ComputeBuffer を用意する
- それぞれを、 ComputeShder 及び描画用の Material/MaterialPropertyBlock に、
.SetBuffer()
する - 計算前の ComputeBuffer に、点のデータを
.SetData()
する - ComputeShader を
.Dispatch()
で起動する Graphics.DrawProcedural()
を呼ぶ
次に ComputeShader 。
1 | #pragma kernel CSMain |
大したことはしてない。入ってきた点一つに対して、三つの点を出力してるだけ。
点の番号は SV_DispatchThreadID.x
なのだが、この辺の説明は他を読んだ方が早いし詳しいです。
最後に描画用の Vertex/FragmentShader 。
1 | Shader "TestCompute" |
スクリプトで .SetBuffer()
したものが StructureBuffer
として渡ってくるので、それをいつも通り変換して送り出すだけの簡単なお仕事。
とりあえず、最小構成はこんな感じというのが分かった。