我正在使用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"类中,并且属于该类的实例(不过我可能完全误解了这一点)。
如果需要更多的代码,请询问,我会发布。
如果能给我一个正确的指示,我将不胜感激。
像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);
请注意,统一值具有着色器程序范围。因此,如果您有多个使用矩阵的着色器程序,并且希望为所有着色器程序更改矩阵,则必须在使用glUseProgram()
使其处于活动状态后,为每个着色器程序调用glUniformMatrix4fv()
。