2015-05-02 42 views
1

我發現下面的代碼:glBufferData&glBufferDataARB

glGenBuffers(1, &m_posVBO); 
glBindBuffer(GL_ARRAY_BUFFER, m_posVBO); 
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW); 
glVertexAttribPointer(particle_attributes::POSITION, 4, GL_FLOAT, GL_FALSE,0,0); 
glEnableVertexAttribArray(particle_attributes::POSITION); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

glGenBuffers(1, &m_colorVBO); 
glBindBuffer(GL_ARRAY_BUFFER, m_colorVBO); 
glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW); 
glVertexAttribPointer(particle_attributes::COLOR, 4, GL_FLOAT, GL_FALSE,0,0); 
glEnableVertexAttribArray(particle_attributes::COLOR); 

glBindBufferARB(GL_ARRAY_BUFFER, m_posVBO); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, size, m_vPos, GL_DYNAMIC_DRAW_ARB); 
glBindBufferARB(GL_ARRAY_BUFFER, m_colorVBO); 
glBufferDataARB(GL_ARRAY_BUFFER_ARB, size, m_vCol, GL_DYNAMIC_DRAW_ARB); 
glBindBuffer(GL_ARRAY_BUFFER, 0); 

我不知道爲什麼都glBufferData()glBufferDataARB()與一個獨特的VBO分別叫,又是什麼值爲零glBindBuffer(GL_ARRAY_BUFFER, 0)代表什麼?

+0

您能否更具體一些,並解釋您期望代替唯一的VBO或空值? – mins

+0

@mins例如,m_posVBO用於glBufferData和glBufferDataARB的參數。我認爲這些做了兩個緩衝區,看起來很奇怪,因爲我認爲VBO只能有一個緩衝區。 – Mackerel

+0

@mins此外,我知道glBindBuffer的第二個參數是VBO標識值。是一個零有效的VBO標識值? – Mackerel

回答

5

glBufferDataARB()glBufferData()用於相同的目的。第一種形式的ARB表示入口點是由OpenGL ARB(架構審查委員會)批准的擴展的一部分。第二種形式是標準OpenGL規範的一部分。

常見的過程是新的OpenGL功能首先作爲擴展提供。然後,他們可以通過不同的階段:

  • 有時,他們開始爲供應商特定擴展,它是由具有類似於NV供應商代碼作爲其名稱的一部分,他們表示。
  • 如果多個供應商對擴展名達成一致,則以其名稱中的EXT表示。
  • 如果體系結構審查委員會批准擴展,EXT被替換爲ARB
  • 如果功能成爲標準OpenGL的一部分,它將被添加到OpenGL規範中,並且入口點不再有特殊的字母代碼。

在你的例子中,glBufferDataARB()ARB_vertex_buffer_object extension的一部分。此功能隨後成爲1.5版標準OpenGL的一部分。這是很久很久以前(2003年7月29日)。

這意味着對於任何版本1.5和更新的版本,您可以並應該使用glBufferData()。在這種情況下絕對沒有理由使用glBufferDataARB()

爲相同功能混合標準和擴展入口點可能存在問題。在某些情況下,功能被採用的方式與其在相應的擴展中定義的方式完全相同,並且兩者是等同的。但在其他情況下,它們可能會在此過程中進行一些微小的調整,或者甚至有多個類似功能的擴展,在將功能添加到標準時進行了整合。在這些情況下,混合標準和擴展入口點可能不起作用。

總結:如果您的OpenGL實現對功能具有標準支持,請勿使用擴展名(ARB)。而永不混合相同功能的標準和擴展形式。

對於你的問題的第二部分:

glBindBuffer(GL_ARRAY_BUFFER, 0); 

解除綁定以前綁定的緩衝區。圖片綁定一個「空」緩衝區,類似於你在C/C++中使用空指針的方式,以指示指針不指向一個對象。

+0

謝謝你回答:D – Mackerel

相關問題