0

ここでやりたいことができるかどうかは完全にはわかりませんが、(JOGL を使用して) OpenGL でレンダリングされているオブジェクトがたくさんあります。オブジェクトの 1 つのグループについて、そのグループ内の特定のオブジェクトが、そのグループ内の他のオブジェクトの前にレンダリングされるようにしたいと考えています。深度バッファ ビットをクリアして、「フロント」オブジェクトを最後にレンダリングしようとしましたが、画面上の他の深度バッファリングが台無しになることを除けば、うまくいきます。

要するに、レンダリングされるオブジェクトのリストがあり、そのリスト内の特定のオブジェクトが他のオブジェクトの前にレンダリングされるようにしたいということです (ただし、それらはすべて同じ Z 座標にあります)。それを行う方法はありますか?

ありがとう、ジェフ

4

1 に答える 1

1

これは、透明なオブジェクト (alpha!=1 の部分を持つオブジェクト) を描画するための非常に一般的な手法です。

最も一般的なアプローチは、最初に描画するオブジェクトのツリーを構築し、投影*カメラ マトリックスを通過した後に「深さ」に沿ってソートできるようにすることです。基本的に、GPU でやみくもに三角形を投げる代わりに、ワールド内で処理しているオブジェクトを 1 つずつ一時バッファーに送信します。これらのオブジェクトは、すべての三角形とすべての頂点カラー/頂点シェーダー/テクスチャ名 + ID などを完全に認識しています。次に、バッファーを並べ替えることができます (単純に、オブジェクトごとに並べ替えるか、オブジェクト間の同様のパッチに基づいて本格的な並べ替えを行います)。

私が正しく思い出せば、glDepthMask トリックは次のようになります。

glDepthMask(true);
drawOpaqueObjects();
glDepthMask(false);
drawTransparentObjects();

最良の結果を得るには、透明なオブジェクトを後ろから前にソートしますが、ほとんどの (単純な) アプリケーションでは、これは問題ではありません。

編集: 2 番目の手法では、深度バッファーの書き込みを有効にしてから無効にしながら、深度バッファーのテストを引き続き使用することに注意してください。そのため、通常のオブジェクトの背後にある透明なオブジェクト (たとえば、画面の「中」を指しているヘルメット) は描画されません。 .

于 2010-03-25T14:26:50.130 に答える