存储由函数 opengl 创建的矩阵

store a matrix created by a function opengl

我想知道是否有一种简单的方法可以将创建的矩阵存储到一个变量中,以便稍后由 glLoadMatrix() 调用,重点是将矩阵重置为较早的状态。

例如:

void reshape(int w, int h){
    glViewport(0, 0, (GLsizei)w, (GLsizei)h);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluPerspective(dist, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
    glMatrixMode(GL_MODELVIEW);
    glLoadIdentity();
    glTranslatef(x_shift, y_shift, z_shift);
}

目标是将生成的矩阵存储到一个单独的变量中,以便在乘法之前有效地保存当前矩阵状态。

我已经建议完全停止使用 GL 矩阵堆栈。它已被贬低并已从现代 OpenGL 的核心配置文件中删除。可以使用像 glm 这样的库。

不过,你所求的,可以用矩阵栈来完成。只需使用 glGetFloatv()GL_MODELVIEW 矩阵,GL_PROJECTION_MATRIXGL_TEXTURE_MATRIX 来查询当前各自的矩阵:

GLfloat m[16];
glGetFloatv(GL_MODELVIEW_MATRIX, m);
// other GL code modifying the MODELVIEW matrix
// ...
glMatrixMode(GL_MODELVIEW); // make sure we restore to MODELVIEW
glLoadMatrixf(m); // restore it

在您使用的旧功能中,矩阵作为堆栈进行管理。或者更确切地说,作为4种矩阵模式中每一种的单独堆栈,其中最常用的是GL_MODELVIEWGL_PROJECTION

save/restore 矩阵最直接的方法是在这个矩阵堆栈上使用实际的堆栈操作,这是用 glPushMatrix()glPopMatrix() 完成的,其中 Push并且 Pop 遵循通常的堆栈语义:

  • Push: 通过复制当前栈顶条目添加一个堆栈条目。
  • Pop: 删除当前顶部条目。

假设你先设置矩阵1,然后设置矩阵2,然后想恢复矩阵1。为了说明,我将设置矩阵1为旋转矩阵,矩阵2为平移矩阵,但它们当然可以是任何东西。

glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glRotatef(...);
// This is our matrix 1, now on top of the stack.
glPushMatrix();
// Push a new stack entry, to save matrix 1.
glLoadIdentity();
glTranslatef(...);
// Now we have matrix 2 on top of the stack.
glPopMatrix();
// Since we popped the top entry (matrix 2) off the stack, matrix 1 is
// now the active matrix at the top of the stack again.

您也可以使用glGetFloatf(GL_MODELVIEW_MATRIX, ...)glGetFloatf(GL_PROJECTION_MATRIX, ...)获取当前矩阵,稍后再使用glLoadMatrix()设置它们。但是,如果您完全关心性能,则应该真正避免 glGet*() 调用。