2011-12-14 38 views
10

我正在研究一些圖形應用程序,並在glPopAttrib()之後得到GL_INVALID_OPERATION。預測答案「看起來您在glBegin/glEnd區塊內撥打glPopAttrib()」請參閱我使用GLIntercept製作的日誌。glPopAttrib&GL_INVALID_OPERATION

/* tons of wglGetProcAddress* */ 
wglGetProcAddress("glEndOcclusionQueryNV")=087C9B10 
wglGetProcAddress("glBeginTransformFeedbackN...")=087C9ED0 
wglGetProcAddress("glEndTransformFeedbackNV")=087C9F00 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() glGetError() = GL_INVALID_OPERATION # <---- THIS 
glPopAttrib() 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPushAttrib(GL_POINT_BIT | GL_LINE_BIT | GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() 
glPopAttrib() 
glPushAttrib(GL_VIEWPORT_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPushAttrib(GL_COLOR_BUFFER_BIT) 
glPopAttrib() 
glPopAttrib() 
glPopAttrib() 
/* and so on */ 

沒有glBegin/glEnd召喚錯誤causeing glPopAttrib()之前進行。 (我用findstr commad來過濾日誌)。

錯誤只出現一次,在代碼執行過程中再次出現錯誤(或其他錯誤)。我懷疑我應該在glPushAttrib(GL_VIEWPORT_BIT)之前撥打一些功能。

+0

這意味着在調用glPopAttrib之前發生錯誤 – 2011-12-14 14:15:24

回答

2

有趣的問題。讓我想到..

可能發生的情況是,當從窗口系統獲得OpenGL上下文時,與COLOR_BUFFER_BIT相關聯的一些狀態變量未使用適當的值進行初始化。當您執行glPushAttrib時,那些(可能)不正確的值被保存,並且當attrib被彈出時,不正確的值被恢復 - 導致無效操作?這聽起來合乎邏輯嗎?

2

我有同樣的問題,終於想通了原因: 當你調用一個glPushAttrib(GL_COLOR_BUFFER_BIT)GL_INVALID_OPERATION之間glBindFramebuffer一個一個glPopAttrib,一對glPopAttrib通話造成的。

這甚至發生在調用glPopAttrib之前恢復原始幀緩衝區綁定時。

唯一的解決方案似乎是要麼避免glPushAttrib和glPopAttrib之間的所有glBindFramebuffer調用,要麼通過手動存儲和恢復所有相關的顏色緩衝區狀態來避免使用glPushAttrib和glPopAttrib。

相關問題