Closed15

VFX GraphにGraphicsBufferを渡す

にー兄さんにー兄さん

Unityステーションでもちょっとお話があったのだけど
従来のVFX Graphに配列を渡したいときはテクスチャベイクが必要だった

自分もAzure Kinect VFXを作る時はテクスチャを作っていたし、
この機にGraphicsBuffer使えないかなぁと思っている
https://t.co/fLp4e7gy0r

にー兄さんにー兄さん

そもそも自分があまりComputeShader詳しくないからなぁ
そろそろおべんきょしなきゃ

にー兄さんにー兄さん

構造的な型(つまり構造体)ってとれるのかな
そもそもVFX Graph側のインターフェースがわからんので
まずはVFX Graphでどんな感じになってるのか確認してからでいい気がする
たしかSample Bufferなんちゃら、みたいなノードが生えてる

にー兄さんにー兄さん

現時点で最新のベータ版である2021.2.0b9をインストしたので新規作成をしていく
今回はHDRPのテンプレは使わずに普通のプロジェクトから作っていく

にー兄さんにー兄さん

スクリプトにはvfx.SetGraphicsBuffer的なメソッドが用意されていて、
そこにGraphicsBufferを渡せばおk

にー兄さんにー兄さん

SampleGraphicsBufferノードは、bufferとindexを指定したらanyな出力がされるらしい
構造体は無理かもだけど、VFX Graphで使えるデータ型なら受け取れそう

にー兄さんにー兄さん

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はメインスレッドじゃないとだめなんだとか
デバッグしてたらそんな感じのエラーが出た

このスクラップは2021/09/17にクローズされました