OpenGL ES 1.0 Android正交投影:模拟器中没什么(但可以在手机上运行)

时间:2013-11-11 19:21:41

标签: android opengl-es orthographic

这个问题让我一无所知:我在透视投影中渲染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生成矩阵
  • 为三角形使用了不同的尺寸

任何见解?

P.s。:是的:这是严格的GL ES 1.0 - 我可能会使用1.1 - 但我还没准备好着色器,但是:)

1 个答案:

答案 0 :(得分:1)

原来问题在于在模拟器上切换PROJECTION_MATRIX和MODELVIEW_MATRIX:由于某种原因,模拟器清除标志“GL_TEXTURE_2D”。我为3D绘图启用了它,切换到正交投影,绘制了叠加层,切换回透视图---此时GL_TEXTURE_2D被禁用。在每个帧上启用它解决了这个问题。