在GLES 1.0
我们可以:
gl.glPushMatrix();
gl.glTranslatef(...);
gl.glScalef(...);
gl.glTranslatef(...);
gl.glPopMatrix();
现在:
Save?
Matrix.translateM(...);
Matrix.scaleM(...);
Matrix.translateM(...);
Restore?
我如何保存&在GLES 2.0中恢复矩阵?也许在着色器?
答案 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/。然而,它几乎解释了一切:
答案 2 :(得分:0)
现在?
oldmatrix = Matrix;
Matrix.translateM(...);
Matrix.scaleM(...);
Matrix.translateM(...);
glUniformMatrix4f(…, Matrix);
render_stuff();
Matrix = oldmatrix;