OpenGL:矩阵栈的函数

OpenGL: Function of matrix stack

我有一些代码可以执行各种转换并在调用 glPushMatrix() 和 glPopMatrix() 之间设置颜色,基本上是这样的:

glLoadIdentity();
glPushMatrix();

glPushMatrix();
// C++ code to perform transformations
// C++ code to set colour
// C++ code to draw polygon
glPopMatrix();

// Other similar code "blocks" between calls to glPushMatrix() and glPopMatrix()

glPushMatrix();
// C++ code to perform transformations
// C++ code to set colour
// C++ code to draw polygon
glPopMatrix();

我的理解是,单位矩阵在开始时被压入堆栈,随后由每个连续的 "block" 代码复制、转换、渲染和弹出,并且弹出会删除所有效果之前的转换。

但是,如果我注释掉在任何非最终块中设置颜色的代码,该块现在会继承在最终块中设置的颜色

如果颜色应用于整个堆栈并因此在调用 glPopMatrix() 后仍然存在,这就有意义了。但是,在最后一个块中创建的多边形似乎是最后渲染的,因为它位于所有其他多边形之上——所以我看不出如何将在最后一个块中设置的颜色应用于已经渲染过的多边形已渲染。

问题:

1) 什么 attributes/effects 在调用 glPopMatrix() 后仍然存在?

2) 上面代码的操作顺序是什么?块是否以相反的顺序执行,每个块中的代码是否以相反的顺序执行,或两者都有?

顾名思义,glPushMatrix() and glPopMatrix() only save/restore the matrix state. Color values are not stored - you'd need to use glPushAttrib()

OpenGL 指令按照您期望的顺序处理:从头到尾。如果您删除 first 多边形的 glColor3f() 内容,您通常会看到使用 final 多边形的颜色值,因为最后定义的颜色值(即为最终多边形设置的颜色值)在重新绘制屏幕时仍将是 "active" 颜色值

顺便说一下,你不需要在开始时将矩阵状态压入两次:

glLoadIdentity();
glPushMatrix();

glPushMatrix();

glLoadIdentity() 函数设置 当前 矩阵状态 - 之后无需将其推入堆栈。您的代码可能如下所示:

glLoadIdentity();  // Set the matrix to an "identity" state.

glPushMatrix();  // Save the identity matrix.
transformTheMatrix();
drawSomething();
glPopMatrix();  // Restore the identity matrix.

glPushMatrix();  // Save the identity matrix.
transformTheMatrix();
drawSomething();
glPopMatrix();  // Restore the identity matrix.

...甚至这个:

glLoadIdentity();
transformTheMatrix();
drawSomething();

glLoadIdentity();
transformTheMatrix();
drawSomething();