这个问题让我完全一无所知:我在透视投影中渲染一个 OpenGL ES 场景,并在正交投影中使用一些 2D 叠加。在我的手机(Galaxy S4)上,它完美无缺。但是,在模拟器上,我什么也没看到。我已将代码简化为仅设置正交投影并绘制三角形。你们中的任何人都可以阐明这里可能存在的问题吗?再次:在手机上,此代码显示一个白色三角形,在模拟器上,我什么也看不到。为每一帧调用以下(简化的)代码。
GLES10.glMatrixMode(GLES10.GL_PROJECTION);
GLES10.glLoadIdentity();
GLES10.glOrthof(0, windowWidth, 0, windowHeight, 0.0f, 1.0f);
GLES10.glMatrixMode(GLES10.GL_MODELVIEW);
GLES10.glLoadIdentity();
GLES10.glDisable(GLES10.GL_LIGHTING);
GLES10.glDisable(GLES10.GL_DEPTH_TEST);
GLES10.glDisable(GLES10.GL_CULL_FACE);
FloatBuffer vertexBuffer = OpenGLUtils.allocateFloatBuffer(4 * 6);
vertexBuffer.put(40);
vertexBuffer.put(20);
vertexBuffer.put(40);
vertexBuffer.put(60);
vertexBuffer.put(80);
vertexBuffer.put(20);
vertexBuffer.position(0);
GLES10.glClear(GLES10.GL_COLOR_BUFFER_BIT);
GLES10.glEnableClientState(GLES10.GL_VERTEX_ARRAY);
GLES10.glVertexPointer(2, GLES10.GL_FLOAT, 0, vertexBuffer);
GLES10.glDrawArrays(GLES10.GL_TRIANGLES, 0, 3);
(当然,每帧都重新创建 vertexBuffer 很愚蠢——但如果我每帧都创建它,它不会改变(视觉)结果)。为了完整起见,这里是 openGL 的初始化代码:
GLES10.glViewport(0, 0, windowWidth, windowHeight);
GLES10.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
GLES10.glShadeModel(GLES10.GL_SMOOTH);
手机的分辨率为 1920 x 1080(windowWidth/windowHeight),而模拟器使用的是 1024x600。
我尝试过的一些事情(没有成功):
- 改变近/远剪裁平面
- glOrthof 的归一化坐标为 0..1(并相应地修改了顶点坐标)
- 使用 Matrix.orthoM 而不是 GLES10.glOrthof 来生成矩阵
- 为三角形使用了不同的尺寸
有什么见解吗?
Ps:是的:这是严格意义上的 GL ES 1.0——我可能会使用 1.1——但我还没有准备好使用着色器 :)