パーティクルシステムで独立した透明度を注文する


9

私はパーティクルシステムを作成していて、次の理由により、パーティクルを並べ替えることなく適切なアルファブレンディングを実現するためのトリックを見つけたいと思います。

  • 各パーティクルは単一のメッシュ内のポイントスプライトであり、シーングラフ機能を使用して透明なノードを並べ替えることはできません。ただし、システムノードは適切にソートする必要があります。
  • パーティクルの位置は、初期速度、加速度、時間からシェーダーで計算されます。システムをソートするには、CPUでこのすべての計算を実行する必要がありますが、これは避けたいものです。
  • カメラの位置に対して何百ものパーティクルを並べ替え、フレームごとにGPUにアップロードすることで、静かで重い操作が可能になります。

アルファテストはGLES 2.0では十分高速であるように見え、非透過ではあるが「マスクされた」テクスチャに対しては問題なく機能します。それでも、半透明の粒子には十分ではありません。

これをどのように扱いますか?


それらが適切に分類されることは絶対にどれほど重要ですか?バニラブレンディングを使用して、(重要な)アーティファクトを実際に見ましたか?
ChrisE、2011年

パーティクルは別のパーティクルではなく背景とブレンドでき、ポイントスプライトの「長方形」のエッセンスが非常に目立ちます。アルファテストはここで役立ちますが、アルファ値が非常に低くてもフラグメントを破棄するのに十分ではない場合、アーティファクトは依然として顕著です。
ステパンZastupov

6
パーティクルをレンダリングするときに、深度の書き込みを無効にしてみました(深度テストをオンのままにしました)。これにより、誤った順序がわかりにくくなるはずです。
アダム

2
いくつかの実験の結果、深度書き込みを無効にすることがほとんどの場合に最適なソリューションであることがわかりました。
ステパンZastupov

回答:


10

これが私がすることです。

ステップ1:ソートしないでください。早くやれよ。それが問題かどうかを確認します。おそらくそうではありません。

ステップ2:パーティクルを、次のように、実際にソートする必要のないものに制限します。

  • ソリッドのみ(アルファからカバレッジエッジの可能性あり)

    • zbufferにソートを処理させます。
  • 単なる追加ビット

    • a + b = b + aなので、順序は関係ありません

ステップ3:さらに必要な場合は、パーティクルレンダリングを前にあるビットと残りのビットに分割し、複数のパスでレンダリングを実行します(たとえば、複雑な煙を修正できる場合があります)。

手順4:さらに必要な場合、または一般的なソリューションが必要な場合、MRTを使用して非常に大まかなNバケットの並べ替えを行うことが頭に浮かびます。パーティクルをN個の出力サーフェスにレンダリングし、別のパスで合成します。

さらに何かが必要な場合は、特定のユースケースに関する詳細情報が必要になります。しかし、結局のところ、順序の独立性は本当に必要ないはずです。ランダムで十分な数のパーティクルを使用するだけで大​​丈夫です=)


6

パーティクルをレンダリングするときは、深度バッファに書き込まないでください。これにより、すべてのレンダリングとブレンドが可能になります。ただし、シーン内のジオメトリによって適切に遮られるように、深度テストを実行する必要があります。


5

加法混合順序の使用は重要ではありません。

glEnable(GL_BLEND)
glDepthMask(GL_FALSE)
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
DrawParticles();

// Now turn depth masking on and blending off, so state is unchanged.
glDepthMask(GL_TRUE)
glDisable(GL_BLEND)

これは、スプライトテクスチャの背景が透明であることを前提としています。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.