2013-01-05 119 views
0

可能重複:
How does glBufferData know which VBO to work on?爲什麼需要連續多次綁定一個緩衝區?

我在示例代碼中發現(在O'Reilly出版)兩個維也納組織和渲染緩衝區做到這一點不止一次的結合。這背後的推理是什麼?例如,你可能有這樣的一個OpenGL程序的頂部:

glGenBuffers(1, &m_vertexBuffer); 
    glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 

,然後做圖紙之前,你再這樣做:

glBindBuffer(GL_ARRAY_BUFFER, m_vertexBuffer); 
    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), 0); 
    //on to the drawing routine 

刪除其中任一原因繪畫不出現,爲什麼它需要綁定兩次?

又如第一,我們這樣做:

// Create & bind the color buffer so that the caller can allocate its space.  
    glGenRenderbuffersOES(1, &m_colorRenderbuffer); 
    glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); 

然後,創造頂點,以後等我們後來我們再次做到這一點:

// Bind the color buffer for rendering. 
     glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_colorRenderbuffer); 
+0

這不是真的重複,而是回答一個問題,回答另一個問題。 – datenwolf

+0

如果它不是重複的,它不應該投票結束重複。你也不能假定提問者看到兩個不同問題之間的直接關係。 – johnbakers

+0

你注意到你自己,如果你在執行繪製操作之前省略了綁定緩衝區,事情就不會起作用。所以關於綁定過程的一些事情使得OpenGL知道要使用什麼。恕我直言,這是一個非常簡單明顯的心理聯繫。結束投票是因爲兩個問題中的一個是多餘的,其中一個問題應該關閉。 – datenwolf

回答

0

它是而不是需要連續綁定相同的緩衝區不止一次。一次就足夠了。在使用數組緩衝區的示例中,如果在繪製例程之前綁定到另一個(或默認的0)緩衝區,繪圖可能不會出現。

+0

那麼,在任何超出繪製單個簡單對象的OpenGL程序中,換句話說,除了教程之外,您必須在整個渲染幀期間多次在緩衝區對象之間切換。所以說「這不是必須的」就像是說「哦,你不必喝水,只要我們今天下午纔會喝。」 – datenwolf

+0

@datenwolf,「連續不需要......」。 – Kimi

+0

那麼,在OPs程序的某個地方緩衝區綁定被改變了,否則除了第一次調用glBindBuffer之外的任何地方都不會起作用。 OP沒有說明這些電話是否連續發生。假設一般情況,他們可能發生在程序的不同地方。 – datenwolf

1

如果你已經等了的解答您的問題How does glBufferData know which VBO to work on? 這個問題也被回答了。

OpenGL是一個狀態機並調用glBindBuffer select,該緩衝區執行以下操作。

+0

@SebybyJohanns:我不是因果報應/名譽妓女:)我也不是那個意思,我很生硬。我現在編程電腦超過23年,我發現讓事情溝通的唯一方法就是直截了當。 – datenwolf

+0

@SebbyJohanns:曾閱讀Linus Torvalds如何在Linux內核郵件列表中向人們講述/寫信給人們?我愛他如此坦誠直率。每次有人出現一個像Andrew Morton或GKH這樣的人很愚蠢的東西,試圖用外交的方式來解釋它。大部分時間無濟於事。然後Linus走進來,大聲說出每個人的大方向,並且通常會越過這個點。 – datenwolf

+0

好的。我看到你正在比較自己與Linus Torvalds。對一個人有用的東西不適用於每個人。 – johnbakers

相關問題