vvvv gammaでBufferをパーティクルとして飛ばす

2024/02/27に公開

はじめに

Bufferからいろんな値をParticleとして飛ばせそうなのですが、いくつかアプローチが思いついたので備忘録として書き残します。

vvvv gamma 5.2
VL.Fuse Version 1.0.2

StructuredBufferResource(Fuse.Compute)からパーティクルを飛ばす

ビジュアルを作成する目的であれば、FuseのStructuredBufferResourceを使うのが良さそうです。BufferにPositionColorを予め確保しなくても Fuse.Partcile.Attribute のノードを使えば自動的にBuffer側で確保されそうでした。
EmissionStage でパーティクルの生成、ComputeStageで、各パーティクルの位置を動かしたりできます。また、今回は使っていませんがSumillationStage なども存在し、ここでもパーティクルの挙動を変化させたりできるので、特に理由がなければこの方法がマネージドな感じがして良さそうです。

ComputeBuffer(stride.Buffer)からパーティクルを飛ばす

シンプルにComputeBufferをパーティクルとして出すにはstride側のGPU Instancingの仕組みを使う必要がありそうでした。

Float3を扱うComputeBufferを一度MatrixのBufferに変換して、InstancingBufferComponentを経由すれば描画することができそうでした。
Float3からMatrixの変換はTranslate -> MakeInstanceTranceformで行うことができました。(このノードの存在を知らなくてFloat4*4として扱おうとしたらうまくいきませんでした)

ComputeBufferの値をComputeStageでSetしていく

StructuredBufferResource も準備しておきComputeStageComputeBufferの値をSet していくアプローチもありそうです。前述の2つの方式を組み合わせたような形なイメージとなっています。
この場合ComputeBuffer からStructuredBufferResource に対してSetをしている形になるのでEmissionStage は不要になっています。

おまけ

AddCurlNoizeはProsessNodeとしてこんな感じに定義していました。

ちなみに、HelpBrowserのLearnタブからFuse.Particlesのサンプルを見ると「Use CurlForce」というサンプルがあるので、今はこっちで扱われているほうが使いやすいかもです。

Discussion