2013-08-05 73 views
7

我一直在閱讀openGL規範,試圖找到這個問題的答案,沒有運氣。我試圖弄清楚OpenGL是否保證繪製調用(如GLDrawElements或GLDrawArrays)將按照它們在VBO中出現的順序繪製元素,或者可以按任意順序處理這些基元的片段。OpenGL保證頂點緩衝區中的圖元會按順序繪製嗎?

例如,如果我有一個帶30個頂點的頂點緩衝區,其中30個頂點代表10個三角形,每個頂點具有相同的座標。是否會一直呈現與頂點0,1和2相對應的三角形(並因此在底部)?並且對應於頂點28,29,30的三角形總是呈現最後(因此在頂部)?

回答

12

該規範非常小心地定義了一切呈現的順序。頂點數據的數組按順序處理,這會導致以特定順序生成基元。據說每個基元按照順序被光柵化,並且後來的基元不能被光柵化,直到先前的基元完成。

當然,這就是OpenGL所說的應該如何表現。實現可以(並且)通過一次光柵化和處理多個基元來作弊。 但是,他們仍然會服從「彷彿」的規則。所以他們在內部作弊,但仍然會將結果寫入,好像它們都是按順序執行的那樣

所以是的,有一個特定的順序,你可以依靠。除非你使用着色器perform incoherent memory accesses;那麼對於着色器寫入,所有投注都關閉。

1

雖然它們實際上可能以不同的順序繪製並在不同的時間完成,但在最後的光柵操作流水線階段,任何混合(或深度/模板/ alpha測試)都將按照三角形被髮布。

您可以通過使用混合式不上班渲染某些對象確認這一點,例如:

glBlendFunc(GL_ONE, GL_DST_COLOR); 

如果最後的幀緩衝區的內容是由同一任意順序的基元可得出書面,那麼在這樣的例子中,你會看到類似於Z戰鬥的效果。

這就是爲什麼它被稱爲片段着色器(與像素着色器相反),因爲它不是像素,因爲在片段階段之後,它尚未寫入幀緩衝區;僅在光柵操作階段之後。

相關問題