我正在使用OpenGL ES 2.0为Android设备开发应用程序,但我无法理解如何移动相机 - (最终,我试图产生'屏幕抖动'效果 - 所以我需要所有当前渲染的对象齐声移动。)
所以,目前,我有一个SpriteBatch
类,我用它来批量加载实体并在一次OpenGL调用中渲染它们。
在这个课程中,我有 顶点 和 片段 着色器。
所以,我只是为我的对象创建这个类的实例......类似于:
SpriteBatch tileSet1 = new SpriteBatch(100); //100 tiles
然后我将这样呈现:
tileSet1.render();
在我的GLSurfaceView
班级(onSurfaceChanged
)中,我正在设置我的观点:
//offsetX, offsetY, width and height are all valid and previously declared)
GLES20.glViewport(offsetX, offsetY, width, height);
Matrix.orthoM(mProjMatrix, 0, -ratio, ratio, -1, 1, 3, 7);
然后,在我的onDrawFrame()
方法中,我只需调用我的所有逻辑并渲染如下:
logic();
render();
(显然,为了这个问题,我的游戏循环已经大大简化了。)
我真的不确定我应该把Matrix.setLookAtM
放在哪里。
我已经尝试将它放入我的'GLSufaceView'类中 - 再次,在onSurfaceChanged
中,但它似乎没有任何效果。 setLookAtM
如何处理着色器?我问,因为我的着色器在我的'SpriteBatch'类中并且属于该类的实例(尽管我可能完全误解了这一点)。
如果需要更多代码,请询问,我会发布。
会欣赏指向正确方向的指针。
答案 0 :(得分:3)
Matrix.orthoM()
和Matrix.setLookAtM()
等通话根本不会改变您的OpenGL状态。它们只是计算矩阵的实用方法。他们将传递给它们的矩阵中的值设置为第一个参数,而不是其他任何内容。
将这些矩阵应用于OpenGL渲染是一项单独的任务。在典型用例中,您需要的主要步骤是:
在顶点着色器中声明类型为mat4
的统一变量。
uniform mat4 ProjMat;
在顶点着色器代码中转换顶点时使用矩阵:
gl_Position = ProjMat * ...;
在Java代码中,在编译和链接着色器后获取统一变量的位置:
int projMatLoc = GLES20.glGetUniformLocation(progId, "ProjMat");
计算所需的矩阵,并使用它来设置统一变量的值:
Matrix.orthoM(projMat, ...);
...
GLES20.glUseProgram(progId);
GLES20.glUniformMatrix4fv(projMatLoc, 1, false, projMat, 0);
请注意,统一值具有着色器程序范围。因此,如果您有多个使用矩阵的着色器程序,并希望为所有这些程序更改它,那么在使用glUniformMatrix4fv()
激活它之后,您必须为每个着色程序进行glUseProgram()
调用