7

完全に透明なフラグメントの深度を深度バッファに書き込まないようにOpenGLに指示する方法はありますか?

念のために言っておきますが、レンダリングしたいテクスチャは決して半透明ではありません。そのアルファ値は1.0または0.0のみであり、GL_NEARESTフィルターを使用しているため、その間の値に補間されることはありません。

フラグメントのアルファ値が0.0であることが判明した場合、OpenGLがデプスバッファに単純に書き込めないのは合理的だと思います(このようにして、このようなテクスチャのプリミティブを任意の順序でレンダリングできます)が、 OpenGLにそれをさせる方法を見つけることができません。誰かがそれが可能かどうか、そしてその場合、それがどのように行われるかを知っていますか?

4

1 に答える 1

9

明確にするために:alpha = 0.0のフラグメントをカラーバッファーにもデプスバッファーにも書き込まないようにしますか?さらに、透明なピクセルをマスクするために現在ブレンディングを使用していると思います。そうでなければ、これは問題にならないはずです。

この場合、fragmentshaderでフラグメントを破棄するだけで使用できます。

if( color.a<=0.0 ){
     discard;
 }

これにより、条件が真であるすべてのフラグメントが(フレームバッファーにゼロファクターでブレンドされる代わりに)まったくレンダリングされないことが保証されます。

(何らかの理由で)固定パイプラインをプログラミングしている場合は、アルファテストを使用して同じ動作を得ることができます(個人的には、上位互換性のある(シェーダーを意味する)パスに切り替えることをお勧めしますが、それは重要ではありません)。

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.0f);

これらのメソッドはフラグメントを非表示にする代わりに強制終了するため、追加のボーナスとして、ブレンドよりも高速になる可能性があります(最近は調べていないので、そうかもしれませんが、一般的に遅くなることはないので、それでもプラスです)。

于 2010-11-04T01:02:57.930 に答える