Android Open GL - glDrawArrays - 优化了?

问题描述

这很容易描述,但让我感到困惑。它需要另一双眼睛。像往常一样,我希望它要么是愚蠢的,要么是除了我之外每个人都知道的东西。此外,由于我很少问问题(以前几乎总是有人问过这个问题),我希望我会在格式上做出一些失礼。

下面的代码使用写入到两遍渲染到纹理纹理 [0] 中的纹理绘制对象。然后它执行一个用于其他逻辑的 glreadPixels 然后切换到另一个包含文本的纹理并覆盖对象的中心部分(它实际上是一个功能性的 Open GL 按钮)。使用或不使用 glreadPixels 都存在同样的问题

所以。如果我取消注释第一部分中的两行,它会使用纹理 [1] 在视觉上按预期工作(从功能上讲,这不是我想要的)。如果我将这些行注释掉,它会在视觉上按预期使用纹理 [0] 工作,但最终的 glDrawArrays 应该用纹理 [1] 中的文本覆盖中心面,似乎没有做任何事情,就好像它已经被优化了一样。所以我有两段明显相同的代码,它们在一个上下文中按预期工作,但在另一个上下文中却没有。开关 mButtonFaceHandle 必须工作,因为它在第一个实例中正确运行,纹理 [1]

//This a switch in the shader unrelated to the texture
GLES20.gluniform1i(mButtonFaceHandle,0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textures[0]);
//Draw bezels
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,(numVertices/3)-6);
//GLES20.gluniform1i(mButtonFaceHandle,1);
//GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textures[1]);
//Draw central face
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,(numVertices/3)-6,6);

//glreadPixels omitted for clarity

//This a switch in the shader unrelated to the texture
GLES20.gluniform1i(mButtonFaceHandle,1);
//Redraw central face using texture[1]
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,textures[1]);
GLES20.glDrawArrays(GLES20.GL_TRIANGLES,6);
glioglrenderer.checkGlError("end");

解决方法

深度测试。在绘制之前禁用深度测试并在之后重新启用修复了这个问题。我需要让自己满意这是为什么。两个纹理都被绘制到相同的顶点,这就是为什么我不确定为什么一个比另一个有深度先例。当我知道发生了什么时,我会回来报告。