[Unity5]物理ベースレンダリングに対応したGPUパーティクルを実装

無題

前回実装したGPUパーティクルは、影の描画に対応していませんでした。
今回はUnity5に合わせ、物理ベースレンダリング、影の描画に対応したバージョンを作成したのでご紹介します。

最初は気楽に考えていましたが、ドキュメントがまだ少ないのもあり、実際に作ってみるとピクセルシェーダーによる影の切り抜きや、頂点シェーダからサーフェイスシェーダーへの値の受け渡しなどがかなり大変でした。

 

▼前回
[Unity]コンピュートシェーダ(GPGPU)で1万個のパーティクルを動かす | notargs.com

 

動作

いい感じにアニメーションします。

物理ベースシェーダ/影の描画/ポイントライトなどにも対応しています。

Particle

 

 

ソース

CircleParticle.cs

「擬似インスタンシング」と呼ばれる技術を使っています。

あらかじめ一つのメッシュ内に全パーティクル用のジオメトリを仕込んでおき、UVによってパーティクルIDを表すことで、一回のDrawCallで数千個のパーティクルを描画できます。

パーティクル情報は構造化バッファとして保存しておき、更新、生産にはコンピュートシェーダを活用しています。

CircleParticle.shader

どうしてもサーフェイスシェーダを使いたかったのですが、頂点シェーダからサーフェイスシェーダへIDを受け渡す術が見つからなかったためuv_MainTex.xの整数部をID、小数部をUV座標とみなしてIDの受け渡しを行っています。

ここについては今回のコードの中でも最上級のクソースだと思っているので、何か良い方法があったら教えて下さい。

 

また、ShadowCasterパスを自前で定義し、影についてもサーフェイスシェーダー同様にクリッピングを行っています。

 

Resources/Shaders/Particle/CircleParticleUpdater.compute

パーティクルの更新処理と生産処理です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

(Required)

Proudly powered by WordPress   Premium Style Theme by www.gopiplus.com