我需要在 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_BITGL_ENABLE_BIT 都将在用作 glPushAttrib() 的参数时保存状态。

剩下的就是你用同样的方法去查其他的状态,你就有了权威的答案。