2015-11-16 36 views
0

我有兩個地方調用glVertexAttribPointer()的一些示例代碼。這是必要的嗎?它可以只做一次嗎?glVertexAttribPointer() - 何時應該調用?

第一次 - 頂點緩衝數據關聯: - :

glEnableVertexAttribArray(0); 
glBindBuffer(GL_ARRAY_BUFFER, vboQuad); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(COLVERTEX), 0); 
glDrawArrays(GL_QUADS, 0, 4); 
glDisableVertexAttribArray(0); 

真的有必要來描述頂點屬性兩次渲染回調函數

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(COLVERTEX), 0); 
glBufferData(GL_ARRAY_BUFFER, sizeof(v), v, GL_STATIC_DRAW); 

第二次?

+1

'glVertexAttribPointer'將當前綁定的緩衝區關聯到當前綁定的頂點數組對象。您可以綁定/解除綁定屬性緩衝區的VAO。 –

+0

@ColonelThirtyTwo,謝謝 - 這是否意味着沒有必要在glBufferData之前調用它? ..我應該只在glBindBuffer之後調用它? – SparkyNZ

+1

@SparkyNZ'BufferData'用原始數據填充VBO。在這一點上,繪圖時應該如何解釋數據並不重要(例如,同一數據可能被解釋爲一次平局中的頂點位置,而是另一次平局中的法線)。所以是的,你可以刪除這個第一個電話。 – keltar

回答

1

BufferData用原始數據填充VBO。在這一點上,繪圖時應該如何解釋數據並不重要(例如,同一數據可能被解釋爲一次平局中的頂點位置,而是另一次平局中的法線)。所以是的,你可以刪除這個第一個電話。

如果使用頂點數組對象,你可以設置頂點屬性三分球只有一次(通過結合VBO,使頂點attibute,並設置頂點屬性指針),然後繪製之前,只需要調用glBindVertexArray並已全部記錄頂點attrubtes成立(在繪製調用之前,甚至不需要綁定包含頂點屬性的VBO)。

+0

您需要在創建VAO綁定時綁定VBO - 也許您可以添加以澄清。 –

相關問題