3

至于 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 类,但我不确定如何。

4

1 回答 1

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/

于 2013-05-19T06:48:28.797 回答