2

32 ビットの png テクスチャといくつかの透明な領域を読み込んでいます。初期化関数でこのコードを設定しました:

// OpenGL
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glEnable( GL_ALPHA_TEST );
glEnable( GL_BLEND );
glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
glClearColor( 0.0, 0.0, 0.0, 0.0 );

これは私がテクスチャをロードする方法です:

// Load textures
glGenTextures( 1, &this->texture );

int width, height;
unsigned char* image;

glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, this->texture );
std::string path = "../assets/textures/" + name;
image = SOIL_load_image( path.c_str(), &width, &height, 0, SOIL_LOAD_RGBA );
glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image );
SOIL_free_image_data( image );
glUniform1i( glGetUniformLocation( shader->shader, "materialTex" ), 0 );

glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );

これは私が得る効果です:

例

草の背景を黒から透明にしようとしています。

手伝って頂けますか?

4

1 に答える 1

3

ここにはいくつかの問題がありますが、それらはすべて、アルファ透明度が順序に依存するという事実に要約されます。

そもそも深度バッファを使用している理由は明らかではありません。アプリケーションは 2D のように見え、さらに、2D レイヤーをすべて同じ深さで描画しているようです。それにもかかわらず、描画しようとしている赤い背景を最初に描画する必要があります。

深度テストを有効にして背景を描画すると、その深度値が深度バッファーに書き込まれ、その上に描画しようとした他のスプライトは失敗しますGL_LESS。深さ)。背景を描画するときに深さテストを無効にすると、深さの書き込みも無効になります。これは、問題を解決する 1 つの可能な方法です。

現実的には、深度テストを完全に排除し、アルファ ブレンディングの黄金律に従うことができます。

  • 最初に不透明なジオメトリを描画し、次に半透明のオブジェクトを深さで並べ替えます
于 2014-05-29T22:33:30.583 に答える