5

透明な領域を持つテクスチャをブレンドしようとしています:

glEnable( GL_TEXTURE_2D );
glBindTexture( GL_TEXTURE_2D, ...);
glVertexPointer( 2, GL_FLOAT, 0, ... );
glEnable (GL_BLEND);
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDrawArrays( GL_TRIANGLE_STRIP, 0, 4 );

glDisable(GL_DEPTH_TEST) を追加しない限り、トップ テクスチャの透明な部分が (ブレンドではなく) その下のすべてを上書きします。深度を無効にせずにこれを行う方法はありますか? さまざまなブレンド機能を試しましたが、どれも役に立ちませんでした。

4

1 に答える 1

7

深度テストを有効にしても、実際には深度によってジオメトリがソートされるわけではありません。通常のGL_LESS場合、プリミティブが以前に描画されたものよりビューアーに近くない場合、プリミティブが描画されないようにするだけです。これにより、不透明なジオメトリを任意の順序で描画し、目的の結果を得ることができますが、ブレンドされたジオメトリを正しくレンダリングするには、通常、ブレンドされたオブジェクトの背後にあるすべてが既にレンダリングされている必要があります。

不透明なジオメトリとブレンドされたジオメトリが正しく見えるようにするには、次のことを行う必要があります。

  1. ブレンドされたジオメトリを不透明なジオメトリから分離します。
  2. ブレンドしたジオメトリを後ろから前に並べ替えます。
  3. 通常どおり、すべての不透明なジオメトリを最初に描画します。
  4. ブレンドされたジオメトリをソートされた順序で描画します。深さテストを有効にしたままにし、深さの書き込みを一時的に無効にする必要がありますglDepthMask(GL_FALSE)

または、コンテンツが常に完全に不透明または完全に透明である場合は、アルファ テストを有効にしてブレンドを無効にすることができますが、それはあなたが探しているものではないと思います.

于 2010-05-23T18:08:40.410 に答える