我需要在 OpenGL 中推送和弹出哪些属性?
What attributes do I need to push and pop in OpenGL?
这是一个案例,我想这样做..
void func()
{
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_1D);
glDisable(GL_TEXTURE_2D);
glDepthFunc(GL_LEQUAL);
glDepthRange (0.0, 0.999);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth(1.0f);
glPushMatrix();
{
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(angle.x, 1.0f, 0.0f, 0.0f);
glRotatef(angle.y, 0.0f, 1.0f, 0.0f);
glRotatef(angle.z, 0.0f, 0.0f, 1.0f);
draw();
}
glPopMatrix();
}
我正在推送这些属性,但不确定,所以只想知道哪些属性适用于此功能。
glPushAttrib(GL_LINE_BIT | GL_TRANSFORM_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
func();
glPopAttrib();
Maurice 在上面的评论中链接的手册页 (https://www.opengl.org/sdk/docs/man2/xhtml/glPushAttrib.xml) 应该对您有帮助,而且是最简单的来源。不幸的是,手册页往往有错误和遗漏,因此通常不是很可靠。
如果您想找到权威来源,规范文档是您的朋友。例如,从 https://www.opengl.org/registry/ 下载 OpenGL 4.5 兼容性配置文件规范。您将需要兼容性配置文件版本,因为属性堆栈功能已弃用且在核心配置文件中不可用。
然后,如果你在打开近1000页的PDF文件后没有从椅子上摔下来,你会在第23章第697页开始找到一套完整的状态table
现在,让我们从列表中选择第一个调用来说明如何提取所需信息:
glDisable(GL_DEPTH_TEST);
经过一番搜索,我们降落在 table 23.26 "Pixel Operations"。从底部开始的第二行在第一列中显示 DEPTH_TEST
。在最后一列(属性)中,它表示 "depth-buffer/enable"。这告诉我们该属性属于哪个属性组。在这种情况下是其中两个。
从那里,我们转到第 677 页的 table 21.4 "Attribute Groups"。此 table 列出了属性组如何转换为 _BIT
常量。对于我们的示例,我们发现:
- 深度缓冲区:
DEPTH_BUFFER_BIT
- 启用:
ENABLE_BIT
请注意,规范文档省略了 GL_
前缀。
因此对于深度测试启用状态,GL_DEPTH_BUFFER_BIT
和 GL_ENABLE_BIT
都将在用作 glPushAttrib()
的参数时保存状态。
剩下的就是你用同样的方法去查其他的状态,你就有了权威的答案。
这是一个案例,我想这样做..
void func()
{
glDisable(GL_DEPTH_TEST);
glDisable(GL_FOG);
glDisable(GL_LIGHTING);
glDisable(GL_TEXTURE_1D);
glDisable(GL_TEXTURE_2D);
glDepthFunc(GL_LEQUAL);
glDepthRange (0.0, 0.999);
glEnable(GL_LINE_SMOOTH);
glHint(GL_LINE_SMOOTH_HINT, GL_NICEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glLineWidth(1.0f);
glPushMatrix();
{
glTranslatef(pos.x, pos.y, pos.z);
glRotatef(angle.x, 1.0f, 0.0f, 0.0f);
glRotatef(angle.y, 0.0f, 1.0f, 0.0f);
glRotatef(angle.z, 0.0f, 0.0f, 1.0f);
draw();
}
glPopMatrix();
}
我正在推送这些属性,但不确定,所以只想知道哪些属性适用于此功能。
glPushAttrib(GL_LINE_BIT | GL_TRANSFORM_BIT | GL_ENABLE_BIT | GL_LIGHTING_BIT | GL_CURRENT_BIT | GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);
func();
glPopAttrib();
Maurice 在上面的评论中链接的手册页 (https://www.opengl.org/sdk/docs/man2/xhtml/glPushAttrib.xml) 应该对您有帮助,而且是最简单的来源。不幸的是,手册页往往有错误和遗漏,因此通常不是很可靠。
如果您想找到权威来源,规范文档是您的朋友。例如,从 https://www.opengl.org/registry/ 下载 OpenGL 4.5 兼容性配置文件规范。您将需要兼容性配置文件版本,因为属性堆栈功能已弃用且在核心配置文件中不可用。
然后,如果你在打开近1000页的PDF文件后没有从椅子上摔下来,你会在第23章第697页开始找到一套完整的状态table
现在,让我们从列表中选择第一个调用来说明如何提取所需信息:
glDisable(GL_DEPTH_TEST);
经过一番搜索,我们降落在 table 23.26 "Pixel Operations"。从底部开始的第二行在第一列中显示 DEPTH_TEST
。在最后一列(属性)中,它表示 "depth-buffer/enable"。这告诉我们该属性属于哪个属性组。在这种情况下是其中两个。
从那里,我们转到第 677 页的 table 21.4 "Attribute Groups"。此 table 列出了属性组如何转换为 _BIT
常量。对于我们的示例,我们发现:
- 深度缓冲区:
DEPTH_BUFFER_BIT
- 启用:
ENABLE_BIT
请注意,规范文档省略了 GL_
前缀。
因此对于深度测试启用状态,GL_DEPTH_BUFFER_BIT
和 GL_ENABLE_BIT
都将在用作 glPushAttrib()
的参数时保存状态。
剩下的就是你用同样的方法去查其他的状态,你就有了权威的答案。