在OpenGL ES 2.0中更改相机位置



我正在使用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渲染是一项单独的任务。在一个典型的用例中,您需要的主要步骤是:

  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);
    

请注意,统一值具有着色器程序范围。因此,如果您有多个使用矩阵的着色器程序,并且希望为所有着色器程序更改矩阵,则必须在使用glUseProgram()使其处于活动状态后,为每个着色器程序调用glUniformMatrix4fv()

最新更新