2015-02-08 53 views
0

我有进行各种变换和设置为glPushMatrix()和glPopMatrix()调用之间的颜色,基本上像这样的代码:的OpenGL:矩阵堆栈的功能

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

我的理解是一个单位矩阵是在开始时被推入堆栈,随后被代码中的每个连续的“块”复制,转换,呈现和弹出,并且弹出消除了来自先前转换的所有效果。

但是,如果我注释掉,设置在不是最后的块中的任何块的颜色代码,该块现在继承如果施加的颜色,在最后的块

这是有道理的设置颜色到整个堆栈,并因此保留对glPopMatrix()的调用。但是,在最后一个块中创建的多边形看起来是最后呈现的,因为它位于所有其他多边形之上 - 所以我没有看到最终块中设置的颜色如何应用于已经存在的多边形被渲染。

问题:

1)什么属性/效果求生存,以glPopMatrix()的调用?

2)上述代码中的操作顺序是什么?这些块是以相反顺序执行的,是以相反顺序执行的每个块中的代码,还是两者都执行?

+3

我知道你是刚开始学习OpenGL的,但功能,如glPushMatrix,glLoadIdentity和glPopMatrix已被弃用,不再是核心OpenGL标准的一部分。请考虑学习'现代'的OpenGL。 – 2015-02-08 11:01:32

+0

@ Sir.Tiddlesworth:谢谢。我知道这一点。正如我在OP中所说的,这是一个学校作业的起始代码,我必须照原样处理。 – Schemer 2015-02-08 14:41:24

回答

2

如其名字所示,glPushMatrix() and glPopMatrix()只保存/恢复矩阵状态。颜色值不存储 - 您需要使用glPushAttrib()代替。

OpenGL指令按您期望的顺序处理:从头到尾。如果您删除第一个多边形的glColor3f()材料,则通常会看到最终的多边形的颜色值,因为最后一个定义的颜色值(即为最终多边形设置的一个颜色值)仍然是“主动“颜色值当屏幕重新绘制时

顺便说一句,你不需要在一开始两次推矩阵状态:

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