解決策#1:
- デプスバッファを有効にして、すべての不透明なオブジェクトを任意の順序で最初にレンダリングします。これには、アルファブレンディングなしでアルファテストを使用するすべてのオブジェクトが含まれます。
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
オブジェクト(煙/ガラス/草)の場合:デプスバッファ書き込みを無効にして、最も遠いポリゴンから最も近いポリゴンに透明なシーンをレンダリングします()glDepthMask(GL_FALSE)
。すべての透明なオブジェクトが凸状で交差していない場合は、ポリゴンの代わりにオブジェクトを並べ替えることができます。
glBlendFunc(GL_SRC_ALPHA, GL_ONE)
および(火、glBlend(GL_ONE, GL_ONE)
「魔法の」パーティクルシステム、グロー):深度バッファ書き込み(glDepthMask(GL_FALSE)
)を無効にして、透明なシーンを任意の順序でレンダリングします。
- 手順3の後で、深度バッファが有効なオブジェクトをレンダリングしないでください。
解決策#2:
デプスピーリングを使用します(グーグルで検索します)。特に透明なオブジェクトが互いに交差する場合。ソリューション#1を必要とするパーティクルシステムや草には適していません。
次に、ほぼすべてのフレームでCPU上で手動で並べ替えます
挿入ソートは、すでにソートされているデータまたは部分的にソートされているデータに最適です。
これをGPUに委任する方法が必要です...
草のある領域とない領域をマークするチャネル(たとえば、アルファ)を持つテクスチャを使用して、ジオメトリシェーダーで草のポリゴンを(正しい順序で)生成できると思います。OpenGL 4が必要です。おそらく、草のパッチを生成するためにシェーダーにフィードするポリゴンに対して、ある種の高レベルの並べ替えを実行する必要があります。
個々の低木は、すべての方向で完全に対称である場合、頂点シェーダーで(+-90/180/270度)回転して、正しいポリゴンの順序を維持できます。
また、GDGPUアプローチまたはOpenCL / CUDAのいずれかを使用して、GPUで適切に並列化され、実行できるマージソートアルゴリズムがあります。
ただし、そのようなものを使用して5つの草の低木をレンダリングすることは、グレネードランチャーでゴキブリを殺そうとすることとほぼ同じです。楽しいことですが、正確には効率的ではありません。
実際にパフォーマンスの問題が発生するまで、「GPUへのオフロード」を忘れることをお勧めします。プロファイラーを使用し、最適化する前に常に測定してください。そうしないと、不要な最適化を行うために大量の開発時間を浪費することになります。