2

そのため、適用されたテクスチャの一部にアルファチャネルがある場合に、OpenGLで3Dモデルをレンダリングするための最良の方法を見つけようとしています。

デプスバッファを有効にして、3Dモデルのすべての三角形の描画を開始したときに、モデル内の別の三角形の前にある三角形を描画すると、それに到達したときに後ろの三角形がレンダリングされません。問題は、前の三角形がアルファ透明度を持ち、後ろの三角形まで透けて見えるはずなのに、後ろの三角形がまだレンダリングされていない場合です。

デプスバッファを無効にすると、その問題は解消されますが、三角形が不透明な場合でも、後でレンダリングすると、その背後にある三角形が上にレンダリングされるという明らかな問題が発生します。

たとえば、基本的にいくつかのコーンが互いに積み重ねられ、ベースが透明な松の木をレンダリングしようとしています。次の図は、デプスバッファが有効になっている場合に発生する問題を示しています。

デプスバッファが有効

透明な三角形の輪郭がどのように見えるかがわかります。

次の図は、デプスバッファが無効になっている場合の様子を示しています。

デプスバッファが無効になっています

ここでは、ツリーの背面にある三角形の一部が、ツリーの残りの部分の前にどのようにレンダリングされているかを確認できます。

この問題に対処し、松の木を適切にレンダリングする方法はありますか?

PS私はすべてをレンダリングするためにシェーダーを使用しています。

4

3 に答える 3

5

部分的な透過性を使用していない場合(すべてが0または255のいずれか)、glEnable(GL_ALPHA_TEST)を使用できます。これは、役立つはずです。問題は、最初に上部の円錐をレンダリングすると、クワッド全体がzバッファ(透明な部分も含む)に配置されるため、下の枝が描画されるときにzが拒否されることです。アルファテストを有効にしても、ピクセルがアルファテスト(glAlphaFuncで設定)に失敗した場合、ピクセルはzバッファーに書き込まれません。

部分的な透明度を使用する場合は、レンダリングオブジェクトの順序を後ろから前、またはケースの下から上に並べ替える必要があります。

zバッファも有効にしておく必要があります。

[編集]おっと、シェーダーを使用しているときに、私が信じていない機能が機能することに気づきました。シェーダーの場合、アルファ値がゼロに近い場合は、フラグメントシェーダーで破棄機能を使用します。

if(color.a < 0.01) {
   discard;
} else {
   outcolor = color;
}
于 2012-03-10T02:53:57.023 に答える
0

2パスアルゴリズムを実装する必要があります。

最初のパスは背面のみをレンダリングし、2番目のパスは前面のみをレンダリングします。

このように、三角形を並べ替える必要はありませんが、ジオメトリが凸状であるかどうかによって、アーティファクトが発生する場合があります。

于 2012-10-21T16:16:44.467 に答える
-2

私は間違っているかもしれませんが、これは、3Dでレンダリングするときに、Directxのデフォルト設定を使用して三角形の裏側をレンダリングしないためです。Zを削除すると、三角形が順番に描画され、Zが付いている場合は三角形の裏側が描画されません。もう三角形。Zを有効にしても、三角形の両側を表示することは可能ですが、速度など、通常は有効になっている理由があるのではないかと思います。

Device->SetRenderState(D3DRS_CULLMODE, Value);

値は等しくなります

D3DCULL_NONE - Shows both sides of triangle
D3DCULL_CW - Culls Front side of triangle
D3DCULL_CCW - Default state
于 2012-06-24T07:47:00.937 に答える