2017-02-01 34 views
0

考慮下面的情況的OpenGL調用之後突變下的基準數據

glDeleteBuffers(1, &buffer); 
// buffer = 0; 
... 
if(buffer == 0) { 
    // Should not pass but does. 
} 
當然當執行glDeleteBuffers,緩衝器被設置爲0

,但考慮發出DELETE,它實際上正在執行之間的延遲,我可能會遇到非零值。

上面的條件保持隨機傳遞,這是不希望的。

我的問題是,我可以分配零緩衝沒有影響排隊命令?我明白,在傳遞價值時,沒有什麼不好的事情會發生,但我在文檔中沒有發現如何處理引用。 OpenGL是否將數據從引用複製到一些不可變的臨時緩衝區,然後才被「消耗」?

試圖指定-1希望它會產生一個錯誤,但由於問題的隨機行爲,我真的不想依靠「沒有發生,不會發生」。

+3

爲什麼你認爲'glDeleteBuffers'改變緩衝區的值?第二個參數是'const GLuint *',這意味着它不能被該函數修改。 – BDL

+0

現在這很奇怪,因爲條件並不總是通過。 –

+0

未定義的行爲,因爲您在告知GL刪除它之後正在使用'buffer'。 – lfgtm

回答

3
當然執行glDeleteBuffers時

,緩衝器被設置爲0

不,事實並非如此。 glDelete*函數都不會修改您提供的緩衝區名稱。

但是,由於發出刪除和實際執行之間的延遲,我可能會遇到非零值。

即使glDelete*功能沒有覆蓋您通過陣列,他們會這麼做立即,就像almost every other OpenGL function that writes to memory you provide

我的問題是,我可以分配零緩衝區,而不會影響排隊命令?

buffer只是一個整數;你可以將它設置爲任何你喜歡的。 OpenGL將繼續做它正在做的事情。

當你刪除一個OpenGL對象時,它實際上只會被刪除after the object stops being attached to other objects and after the GPU gets done with whatever processes acted on it。但是否拋棄對該對象的引用與此無關。

0

glDeleteBuffers從不會更改傳遞變量的值。實際上,第二個參數是const GLuint*,這意味着它是不變的,不能被修改。

關於傳遞-1:除了這個事實,緩衝引用是無符號整數,該reference狀態:

glDeleteBuffers靜默忽略0和不符合現有緩衝區名稱的對象

一般而言,對於(幾乎)所有的OpenGL調用:您可以將您想傳遞給OpenGL的任何變量分配給您。當OpenGL調用返回時,保證它已經完成處理客戶端內存(有一些例外,請閱讀this瞭解更多細節)。

+0

哦,我的不好,讀了「如果n是負值,就會生成GL_INVALID_VALUE。」並自動假定它是用於緩衝區索引,而不是緩衝區計數。 –