1

我按照这个顺序和 z 顺序在 OpenGL 中绘制对象:

  • 背景四边形,
  • 背景对象=带有标题的图像(纹理)
  • 一个半透明的黑色四边形,使背景对象变暗(具有低 alpha 值的彩色四边形),
  • 和前景对象=带有标题的图像(纹理,但中心的那个后面有一个白色的四边形)

目前,它看起来像这样:

截屏

这不是它应该的样子——“Chikinki”周围的 5 个物体(胆小的老虎、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 值,您是否有任何线索可能导致这些对象变暗,这些对象应该完全不透明?

解决方案

Tim 在评论中指出,纹理绘制受当前颜色缓冲区(其 alpha 值)的影响。在绘制图像之前调用就可以了gl.glColor4f(1,1,1,1);,将先前的调用恢复为gl.glColor4f()低于 1 的 alpha 值。

4

0 回答 0