0

这个问题让我完全一无所知:我在透视投影中渲染一个 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——但我还没有准备好使用着色器 :)

4

1 回答 1

1

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

于 2013-11-13T15:44:25.997 回答