保存&在GLES20中恢复矩阵

时间:2014-01-19 11:52:16

标签: opengl-es opengl-es-2.0

GLES 1.0我们可以:

gl.glPushMatrix();
gl.glTranslatef(...);
gl.glScalef(...);
gl.glTranslatef(...);
gl.glPopMatrix();

现在:

Save?

Matrix.translateM(...);
Matrix.scaleM(...);
Matrix.translateM(...);

Restore?

我如何保存&在GLES 2.0中恢复矩阵?也许在着色器?

3 个答案:

答案 0 :(得分:2)

你不能在OpenGL ES 2.0中推送/弹出当前的矩阵堆栈,因为没有矩阵堆栈这样的东西。您将不得不重新实现自己的等效功能(就像其他与矩阵相关的固定功能管道功能:glFrustum / glMatrixMode / glRotate [df] / glTranslate [df] / ...)并最终更新模型视图/投影/ ...每个绘制调用中使用的统一矩阵。

要提出一个想法,这是一个例子:

    class MatrixStack {
         public:
             MatrixStack();

             // Implement functions similar to glPushMatrix()/glPopMatrix()/glMultMatrix()/...
             void push(const Matrix4x4f& m);
             void pop(const Matrix4x4f& m);
             void mult(const Matrix4x4f& m);
             void load(const Matrix4x4f& m);
             void scale(float x, float y, float z);
             void translate(float x, float y, float z);
             void rotate(float angle, float x, float y, float z);

             // Gets a pointer to the raw data of the top matrix
             const float* get() const;

         private:
             stack< Matrix4x4f > m_stack;
    };

    MatrixStack::MatrickStack() {
        m_stack.push(Matrix4x4f::identity());
    }

    void MatrixStack::push(const Matrix4x4f& m) {
        m_stack.push(m);
    }

    void MatrixStack::translate(float x, float y, float z) {
        // Remplace the top matrix of the stack with itself multiplied by the specified translation
        Matrix4x4f m = m_stack.top();
        m_stack.pop();
        m_stack.push(m * Matrix4x4f::translate(x, y, z));
    }

    const float* MatrixStack::get() const {
        return m_stack.top().data();
    }

    // ...

    MatrixStack modelview_matrix_stack;

    // ...

    modelview_matrix_stack.push();
    modelview_matrix_stack.translate(...);
    modelview_matrix_stack.scale(...);

    // Draw something

    // ...
    glUniformMatrix4f(... modelview_matrix_stack.get() ...); // Update modelview matrix
    // ...
    glDrawArrays(...);

    modelview_matrix_stack.pop();

    // ...

答案 1 :(得分:1)

使用GLSL着色器,您可以将矩阵作为mat4均匀变量传递。这是一个关于OpenGL矩阵的非常好的教程:http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices/。然而,它几乎解释了一切:

  • 确保在CPU上执行所有矩阵乘法(不在GLSL中)。如果你在GLSL中进行所有矩阵乘法,它将在每个顶点完成,这比在CPU上每帧执行一次要慢。

答案 2 :(得分:0)

  

现在?

oldmatrix = Matrix;

Matrix.translateM(...);
Matrix.scaleM(...);
Matrix.translateM(...);

glUniformMatrix4f(…, Matrix);

render_stuff();

Matrix = oldmatrix;