2015-03-18 59 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