在OpenGL ES 2.0中更改相机位置

时间:2014-11-09 19:03:17

标签: android camera opengl-es-2.0 viewport orthographic

我正在使用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'类中并且属于该类的实例(尽管我可能完全误解了这一点)。

如果需要更多代码,请询问,我会发布。

会欣赏指向正确方向的指针。

1 个答案:

答案 0 :(得分:3)

Matrix.orthoM()Matrix.setLookAtM()等通话根本不会改变您的OpenGL状态。它们只是计算矩阵的实用方法。他们将传递给它们的矩阵中的值设置为第一个参数,而不是其他任何内容。

将这些矩阵应用于OpenGL渲染是一项单独的任务。在典型用例中,您需要的主要步骤是:

  1. 在顶点着色器中声明类型为mat4的统一变量。

    uniform mat4 ProjMat;
    
  2. 在顶点着色器代码中转换顶点时使用矩阵:

    gl_Position = ProjMat * ...;
    
  3. 在Java代码中,在编译和链接着色器后获取统一变量的位置:

    int projMatLoc = GLES20.glGetUniformLocation(progId, "ProjMat");
    
  4. 计算所需的矩阵,并使用它来设置统一变量的值:

    Matrix.orthoM(projMat, ...);
    ...
    GLES20.glUseProgram(progId);
    GLES20.glUniformMatrix4fv(projMatLoc, 1, false, projMat, 0);
    
  5. 请注意,统一值具有着色器程序范围。因此,如果您有多个使用矩阵的着色器程序,并希望为所有这些程序更改它,那么在使用glUniformMatrix4fv()激活它之后,您必须为每个着色程序进行glUseProgram()调用