2015-03-18 44 views
0

这是一个情况下,我想去做的..我需要在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(); 
    } 

我推这些atributes,但不知道,所以只是想知道什么属性与此功能确定。

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

https://www.opengl.org/sdk/docs/man2/xhtml/glPushAttrib.xml,这是可以传递给该函数的参数列表以及相应的保存状态。作为一个旁注请记住,状态变化是昂贵的,所以试着对共享相同状态的事物进行分组。 – 2015-03-19 03:02:34

+0

在现代,可能没有可衡量的惩罚,因为要谨慎使用'GL_ALL_ATTRIB_BITS'。很多年前,状态堆栈的大小是有限制的,推动最小状态集是有用的。但是,由于现代OpenGL(核心配置文件)的设计甚至不具备状态堆栈,因此在使用此旧功能时试图提高效率可能会长期影响生产力。 – 2015-03-19 18:35:46

回答

2

该名男子页莫里斯在上述(https://www.opengl.org/sdk/docs/man2/xhtml/glPushAttrib.xml)的评论链接应该让你很长的路要走,而且是最简单的来源。不幸的是,手册页往往有错误和遗漏,因此通常不是很可靠。

如果您想要访问权威来源,spec文档就是您的朋友。例如,从https://www.opengl.org/registry/下载OpenGL 4.5兼容性配置文件规范。您将需要兼容性配置文件版本,因为属性堆栈功能已被弃用,并且在Core Profile中不可用。

然后,如果你没有打开近1000页的PDF文件后,脱落的椅子上,你会发现一个完整的状态表中的第23章,从页面上现在697

,让我们挑从列表中的第一个电话,说明你如何提取您要查找的信息:

glDisable(GL_DEPTH_TEST); 

经过一番搜索,我们的土地在表23.26“像素操作”。底部的第二行在第一列中表示DEPTH_TEST。在最后一列(Attribute)中,它表示“深度缓冲区/启用”。这告诉我们属性属于哪个属性组。在这种情况下,它是其中两个。

从那里,我们转到第247页的表21.4“属性组”。此表列出了属性组如何转换为_BIT常量。在我们的例子中,我们发现:

  • 深度缓冲:DEPTH_BUFFER_BIT
  • 启用:ENABLE_BIT

注意,规范文件离开了GL_前缀。

因此,对于深度测试启用状态,GL_DEPTH_BUFFER_BITGL_ENABLE_BIT将用作参数glPushAttrib()时保存状态。

现在只要你以相同的方式查看其他状态,并且你有权威的答案。

+0

谢谢,它确实有帮助,所以,我需要GL_ENABLE_BIT来处理每个案例,因为我们需要多次启用和禁用某些内容。 – furqan 2015-03-19 21:02:46