2021.2から導入されたらしいMesh.GetVertexBuffer APIを試す
目的
- Unity 2021.2のドキュメントに載っている
Mesh.GetVertexBuffer
APIを試す - Azure Kinectの点群(位置だけ?)を頂点情報に流し込んでみる
UnityのAPIドキュメント
GetVertexBuffer()
はGraphicsBufferオブジェクトを返すので、
これをComputeShaderで処理することで頂点の位置を変化させる
GraphicsBufferは名前の通りバッファオブジェクトで、ComputeShaderのRWByteAddressBuffer
型の変数にバインドして使います
GraphicsBufferはもともとComputeBufferを使っていましたが、2020~はGraphicsBufferを使ったほうが良いという記事があります
自分はComputeShaderは詳しくないので、keijiroさんのNoiseBallというサンプルを参考に
それを紐解いていきながら試してみるという流れにしたい
実装イメージとしては
- MeshやMeshFilterの初期化
- MeshからVertexBufferを取得し、ComputeShaderにバインドする
- Azure Kinectを初期化しカメラを起動
- 点群情報を取得(Short3[]からVector3[]とかに変換しておく)
- 点群からGraphicsBufferを生成してComputeShaderに渡す
- 点群バッファから頂点バッファを計算し更新
- 4~6を繰り返す
って感じ?
なんとなくまだプロジェクト自体には手を付けられておらず、外堀を埋める感じでComputeShaderの勉強などをしている
カーネル、スレッド、グループあたりの理解が厳しい
めーぷるさんの記事とかYocchyさんの記事とかを見ている
ComputeShaderでやることとしては、AzureKinectで取得した点群情報をMeshのVertexBufferに書き込むことまで
VertexBufferはGetVertexBuffer メソッドで取得できるんだけど、keijiro先生および公式のサンプルでは
RWByteAddressBuffer
という型でComputeShaderにバインドしている
ComputeShaderのサンプルでよく見るBufferというえばRWStrcturedBuffer<T>
型なんだけど、
こちらは構造体をジェネリクスに取れるのにたいしてRWByteAddressBuffer
はバッファ単位で読み書きをするためのバッファらしい
AzureKinectから取得できる点群は、デフォルトではShort3
型という、Microsoft.Azure.Kinect.Sensor
名前空間に存在する構造体になっている。
_xyzImage.GetPixels<Short3>.ToArray()
とすればShort3の配列が返ってくるので、
これを模した構造体をComputeShader内に作ってRWStructuredBuffer<Short3>
でバインドすれば取得できると思う
Kinectの点群取得からComputeShaderで使うまでは何となくできるかもだけど、
まだRWByteAddressBufferとして渡されたVertexBufferを操作の方法を理解していない
あとスレッドってどの値を設定すればいいのか、とか