【WebGL】GPUパーティクル、GPUトレイルの実装
概要
8月に勢いで実装したWebGL2で動作するモノです。
デモ
https://t.co/kIHcmrcC5B
— うえした (@ueshita) 2020年8月8日
WebGL2のGPUパーティクルのトレイルっぽいやつ pic.twitter.com/O9BLm5jH2b
リポジトリ
解説
TransformFeedbackは使用せず、複数のテクスチャをダブルバッファ的に使用してパーティクルの更新を行います。
テクスチャレイアウト
X | Y | Z | W | |
---|---|---|---|---|
Tex0(RW) | Pos X | Pos Y | Pos Z | Dir XYZ |
Tex1(RW) | Age | Lifetime | Seed | Vel XYZ |
1テクセルが1パーティクルに割り当てられます。
パーティクル
処理は以下の通りです。
- perticle-emit
- particle-update
- particle-render
emitは1ピクセルのポイントスプライトをgl.drawArrays(gl.POINTS, 0, this.newParticleCount);
で描画して、指定のテクセルに書き込まれるようにします。
updateは四角形をgl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
してフラグメントシェーダで全パーティクルを更新
renderはgl.drawArraysInstanced(gl.TRIANGLE_STRIP, 0, 4, this.maxParticleCount);
で全パーティクルを描画(寿命が過ぎたパーティクルは縮退ポリゴンで消去)します。
トレイル(軌跡)
軌跡情報は2Dテクスチャ配列をリングバッファ的に使って保持します。
gl.copyTexSubImage3D
でTex0をコピーして更新します。
処理は以下の通りです。
- perticle-emit
- particle-update
- (gl.copyTexSubImage3D)
- trail-render
2まではパーティクルと同じ処理です。
トレイルメッシュをgl.drawArraysInstanced
でインスタンス描画しています。