2010-08-18 80 views
2

我知道要使用標準的push/pop操作來保存/恢復矩陣狀態。我一直無法找到像使用glLineWidth()或glColor4ub()時一樣的保存/恢復狀態的慣例。保存/恢復OpenGL ES狀態的正確方法

只要您在任何時候想要繪製任何東西但您可以在自己的繪圖函數中看到自己的位置的示例,就可以正確地設置線寬或顏色,就可以調用一些單獨的繪圖函數在你不知情的情況下你的線條寬度,然後當你繼續繪畫的時候,它不會像預期的那樣出現。

爲了解決這個問題,您可以在調用任何你不知道它做什麼但看起來不雅的函數之後重置你的線寬,我覺得應該已經有一個解決方案,但是我錯過了它以某種方式。

對於我自己的代碼,我在每一個繪圖函數的開始一直在做這樣的:

GLfloat savedLineWidth = 1.0f; 
glGetFloatv(GL_LINE_WIDTH, &savedLineWidth); 
glLineWidth(lineWidth); 

,然後在繪圖函數結束時恢復狀態,像這樣:

glLineWidth(savedLineWidth); 

這並不能真正幫助我,儘管除非我認爲每個繪圖函數我都不知道它的內部是好的,並且可以自行恢復狀態。

我應該做出這樣的假設嗎?或者我錯過了什麼?

回答

1

如果這是普通的OpenGL(未ES變體),那麼你可以像推屬性:

glPushAttrib(GL_LINE_WIDTH); 
glLineWidth(2.0f); 
... etc ... 
glPopAttrib(); 

唉,在OpenGL ES,這是不可用。您獲取和設置的方法與您將獲得的一樣好。

只是嘗試減少您獲得的次數,因爲這是一個非常耗時的過程。與發送不同,獲取不被緩衝。

也許你的方法應該是不用擔心。無論何時你想設置線寬,只需設置它。線寬不應該太多影響。

艱難的召喚。取決於這些其他繪圖功能是什麼。你有代碼嗎?也許你可以看看?

+0

這很酷。我不知道glPushAttrib()和glPopAttrib()在OpenGL的非ES變體中可用。我也沒有考慮堵塞巴士的請求。 是的,我確實有代碼。這只是我現在擺弄的一些繪圖代碼,以嘗試學習OpenGL ES。在我制定任何不良習慣之前,我只是尋找一些指導。 – djdrzzy 2010-08-19 15:35:35