2011-09-25 78 views
4

如何關閉紋理單元,或至少在綁定紋理時防止其狀態發生變化?我使用着色器,所以沒有glDisable這個我不認爲。問題是,事件鏈可能是這個樣子:OpenGL,禁用紋理單元,glActiveTexture和glBindTexture

Create texture 1 (implies binding it) 
Use texture 1 with texture unit 1 
Create texture 2 (implies binding it) 
Use texture 2 with texture unit 2 

,但鑑於glActiveTexture語義,看來這是不可能的,因爲建立紋理2將成爲紋理單元的狀態相關聯1,因爲那是我稱之爲glActiveTexture的最後一個單元。即你必須寫:

Create texture 1 
Create texture 2 
Use texture 1 with texture unit 1 
Use texture 2 with texture unit 2 

我已經簡化過程的例子,但事實證明,創建和綁定紋理可以順帶影響,即使你只綁定了紋理的一部分,當前激活的紋理單元創作過程讓我有些不舒服。除非我在這裏犯了一個錯誤,並且我可以做些什麼來禁用當前glActiveTexture中的狀態更改?

感謝您的任何幫助,您可以在這裏給我。

回答

4

這幾乎是你必須學會​​在OpenGL中生活的東西。 GL功能隻影響當前狀態。所以要修改一個對象,你必須將它綁定到當前狀態,並對其進行修改。

但是,一般來說,你應該沒有問題。沒有理由在你綁定它們使用的同一個地方創建紋理。實際上走過場景並綁定紋理進行渲染的代碼從來沒有正在創建紋理。渲染代碼應該爲每個渲染建立所有必要的狀態(除非它知道所有必要的狀態先前在這個渲染調用中建立)。所以它應該綁定每個對象所需的所有紋理。所以以前創建的紋理將被驅逐。

而且一般來說,我會建議在創建後取消綁定紋理(即:glBindTexture(..., 0))。這可以防止他們繼續前進。

還記得:當你綁定一個紋理時,你還可以解綁定當前綁定的紋理。所以紋理函數只會影響新的對象。

但是,如果您想要依賴EXT擴展,則有EXT_direct_state_access。它受NVIDIA和AMD的支持,因此它的可用性相當廣泛。它允許你修改對象而不綁定它們,所以你可以創建一個紋理而不綁定它。

+0

我剛剛讀到EXT_direct_state_access是一種不完成的文章,所以我想我會避免它。但是總體來說不,我不打算做這樣的紋理創建和交叉綁定,但它確實讓我覺得在某些時候我會得到一個黑色的表面,並且很難追蹤它! – Robinson