VFX GraphにGraphicsBufferを渡す
2021.2b2で使えるらしいGraphicsBuffer supportを使ってみる
Unityステーションでもちょっとお話があったのだけど
従来のVFX Graphに配列を渡したいときはテクスチャベイクが必要だった
自分もAzure Kinect VFXを作る時はテクスチャを作っていたし、
この機にGraphicsBuffer使えないかなぁと思っている
そもそも自分があまりComputeShader詳しくないからなぁ
そろそろおべんきょしなきゃ
えどさんの記事ではComputeBufferだけど、おそらく同じような使い方ができるはず
Bufferオブジェクトを作成して、そのさいにTypeの記述が必要である
作成したオブジェクトに対してSetData()
で配列からBufferに値を入れる
構造的な型(つまり構造体)ってとれるのかな
そもそもVFX Graph側のインターフェースがわからんので
まずはVFX Graphでどんな感じになってるのか確認してからでいい気がする
たしかSample Bufferなんちゃら、みたいなノードが生えてる
現時点で最新のベータ版である2021.2.0b9をインストしたので新規作成をしていく
今回はHDRPのテンプレは使わずに普通のプロジェクトから作っていく
スクリプトにはvfx.SetGraphicsBuffer
的なメソッドが用意されていて、
そこにGraphicsBufferを渡せばおk
SampleGraphicsBufferノードは、bufferとindexを指定したらanyな出力がされるらしい
構造体は無理かもだけど、VFX Graphで使えるデータ型なら受け取れそう
floatのBufferを読み込ませられた
github
Vector3のGraphicsBufferもVFXで渡せた。
GraphicsBufferを作る時に、プリミティブ型ではないので
_buffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, bufferCount, Marshal.SizeOf(new Vector3()));
こんな感じになった
ポイントは、bufferのターゲットが構造体であることと、
バッファ長の単位がMarshalによって調べられること
AKDKを使うためのNUGETパッケージをインポートしたのだが、ちょっと問題が発生した
Unity Searcherというよくわからんパッケージが、
- System.memory
- System.Buffer
- Compiler.Unsafe
あたりのdllをすでにimportしており、dllの衝突が発生
こちらのdllを削除しようとしうるとdllのバージョンが違うみたいでエラーになった
なのでsearcherのdllをハードデリートしました(よくない)
うおうおうお~~ってコード書いてるんだけど
どうやらGraphicsBuffer.SetDataはメインスレッドじゃないとだめなんだとか
デバッグしてたらそんな感じのエラーが出た
できました
詳しくはごたゆにで話そう