对于OpenGL ES 2,我已经理解其中不再存在任何矩阵(矩阵堆栈)。所以我必须创建自己的矩阵。
我想要做的只是画一些简单的2D图形,比如几个矩形。
我发现很多代码都使用OpenGL ES 1或更旧的OpenGL,但仍然存在矩阵堆栈,所以我不能直接在2.0中使用它。
我相信我希望代码可以做到这样的事情
public void onSurfaceCreated(GL10 unused, EGLConfig eglConfig) {
// Set the background frame color
GLES20.glClearColor(0.1f, 0.3f, 0.5f, 1.0f);
// Set 2D drawing mode
GLES20.glViewport(0, 0, windowWidth, windowHeight);
GLES20.glMatrixMode(GL_PROJECTION);
GLES20.glLoadIdentity();
GLES20.glOrtho(0, windowWidth, windowHeight, 0, -1, 1);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
}
但不再有任何方法glMatrixMode,glLoadIdentity,glOrtho。
如何将其转换为OpenGL ES 2以将其设置为2D绘图?我相信我可以使用由android提供的Matrix类,但我不确定如何。
答案 0 :(得分:3)
基本上,您不要使用OpenGL ES 2.0“设置”任何矩阵(因为您设置了其他内容,例如视口,禁用GL_DEPTH_TEST等)。相反,您自己创建和管理矩阵,在每个帧渲染时将它们传递给着色器。
您可以创建一个正交投影矩阵,然后将其作为制服传递给着色器(例如:glUniformMatrix4fv)。
我无法评论究竟如何使用Android,但如果您有Matrix类,它应该具有创建正交投影矩阵的功能。然后你就可以在调用glDrawArrays / glDrawElements / etc之前将一个指向数据的指针(即:16个浮点数--4x4矩阵)传递给glUniformMatrix4fv。
因此,您的上述设置功能会小得多..
public void onSurfaceCreated(GL10 unused, EGLConfig eglConfig) {
// Set the background frame color
GLES20.glClearColor(0.1f, 0.3f, 0.5f, 1.0f);
// Set 2D drawing mode
GLES20.glViewport(0, 0, windowWidth, windowHeight);
GLES20.glDisable(GLES20.GL_DEPTH_TEST);
}
但是你的渲染函数看起来会有所不同(你仍然可以在上面创建你的正投影矩阵......只要确保在必要时更新它......即:屏幕调整大小/移动/等等)。
此页面非常适合Android:
http://www.learnopengles.com/android-lesson-one-getting-started/