私はOpenGLでオブジェクトをこの順序とzオーダーで描画しています:
- 背景クワッド、
- 背景オブジェクト=タイトル付きの画像(テクスチャ)
- 背景オブジェクトを暗くする半透明の黒いクワッド(アルファ値が低い色付きのクワッド)、
- 前景オブジェクト=タイトル付きの画像(テクスチャですが、中央にあるものの後ろに白いクワッドがあります)
現在、次のようになっています。
これは想定どおりではありません。「Chikinki」の周りの5つのオブジェクト(Timid Tiger、The Bishopsなど)は、「Chikinki」の画像と同じくらい明るいはずです。また、すべてのタイトル(Chikinkiを含む)は、実際のテクスチャよりも暗いです。「Chikinki」の画像の後ろにある白いクワッドは、どういうわけかOpenGLにその前に正しく絵を描くように強制しているように私には思えます。半透明の黒いクワッド(中央とその周囲の5つを除くすべてのオブジェクトを暗くするためにあります)がなければ、すべてが正常です。したがって、他のオブジェクトはその後に描画され、z値が高くなりますが、この半透明のクワッドはどういうわけかブリードスルーしているのではないかと思います。
前述のように、オブジェクトは後ろから前に描画され、後ろから前にz方向に配置されます。ブレンディングは常に有効です。白い長方形にはブレンド機能がgl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
あり、すべての画像には機能がありますgl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
。深度テストが有効になります。
関連するテクスチャ塗りつぶしのクワッド描画コード(スクリーンショットでは暗すぎます):
gl.glPushMatrix();
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glActiveTexture(GL10.GL_TEXTURE0);
gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureName);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterx(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
gl.glFrontFace(GL10.GL_CW);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
gl.glEnable(GL10.GL_TEXTURE_2D);
gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, mTexBuffer);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
mFVertexBuffer.position(0);
mTexBuffer.position(0);
mIndexBuffer.position(0);
gl.glDisable(GL10.GL_TEXTURE_2D);
gl.glDisable(GL10.GL_BLEND);
gl.glPopMatrix();
関連するカラーフィルクワッド描画コード(スクリーンショットにOKで表示):
gl.glPushMatrix();
gl.glEnable(GL10.GL_BLEND);
gl.glBlendFunc(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glFrontFace(GL10.GL_CW);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, mFVertexBuffer);
gl.glColor4f(mRed, mGreen, mBlue, mAlpha);
gl.glDrawArrays(GL10.GL_TRIANGLE_STRIP, 0, 4);
mFVertexBuffer.position(0);
mIndexBuffer.position(0);
gl.glPopMatrix();
gl.glDisable(GL10.GL_BLEND);
半透明のクワッドの後に描画され、z値が高いことを考えると、これらのオブジェクトが完全に不透明になるはずのオブジェクトが暗くなる原因となる可能性のある手がかりはありますか?
解決
ティムはコメントの中で、テクスチャの描画は現在のカラーバッファ(そのアルファ値)の影響を受けると指摘しました。画像を描画する前に呼び出すgl.glColor4f(1,1,1,1);
とうまくいき、以前の呼び出しをgl.glColor4f()
1未満のアルファ値で元に戻しました。