2014-03-02 62 views
3

隨着教程here繼獲得介紹的OpenGL 3.3,我明白,頂點和索引緩衝區必須以發出指令,他們glBindBuffer()的約束。有一個提到可以通過將句柄0傳遞給glBindBuffer()來解除緩衝區綁定,這似乎是一個好主意,以防止在完成使用時意外地使用不正確的緩衝區。在發出設置或繪製調用之後,是否有任何理由不總是解除頂點和索引緩衝區的綁定?解綁OpenGL緩衝區有什麼影響?

+0

不這樣做可能是,如果你不使用/與其他框架代碼集成和優化的繪製調用你已經確保適當的配料和狀態改變單一線性的應用程序代碼的唯一原因。 – prabindh

+0

我認爲這是最優化的問題,例如:如果你有哪些影響緩衝,甚至借鑑它的一些功能,以及其他一些常規,將後的第一個總是被稱爲安裝例程,也需要執行操作在一個緩衝區,但不同的一個。所以很顯然,在這種情況下,用所需的緩衝區調用glBindBuffer()而不是用0調用它然後綁定第二個緩衝區會更有效率。 – UnTraDe

回答

5

由於OpenGL的架構作爲一個狀態機,這些話題是經常提出 - 並沒有明確的答案。根據綁定目標,緩衝區綁定確實會影響各種其他GL命令的操作。

在一些情況下,對象0 represenets一些「無緩衝器/缺省對象」的情況。例如,使用GL_PIXEL_UNPACK_BUFFER,使用0將允許您將像素數據直接從客戶端內存傳輸到GL - 因此,如果您想這樣做,您絕對需要在某個點解除綁定任何綁定的PBO。如果你儘可能早或儘可能晚地取決於程序員,並且嚴重依賴於軟件的體系結構。一般規則應該是避免不必要的狀態更改,並且包括緩衝區(un)綁定操作。但是,遵循這條路線通常會導致某些狀態「泄漏」出其實際意圖的範圍 - 而這種情況可能會令人煩惱以進行調試。

在其他情況下,0是不要做任何有效狀態。例如,現代GL需要你使用VBOs。作爲GL_ARRAY_BUFFER的唯一用例 - 指定一些attrib指向客戶端內存的指針 - 已經消失了,因此沒有必要將0綁定爲GL_ARRAY_BUFFER。所以解綁VBO總是浪費時間 - 下次你設置一個attrib指針,你必須綁定一些VBO,如果你沒有設置attrib指針,那綁定目標是完全不相關的。