這是一個奇怪的問題。我有一個功能:
void drawLines(std::vector<GLfloat> lines) {
glBindVertexArray(VAO2);
//positions
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
//colors
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, VBO2);
glBufferData(GL_ARRAY_BUFFER, sizeof(lines[0]) * lines.size(), &lines[0], GL_STATIC_DRAW);
glUseProgram(pShaderProgram);
glDrawArrays(GL_TRIANGLES, 0, lines.size() / 6);
}
它繪制指定粗細的線(這是內置在其中的資料中,lines其中包含三個用于位置的浮點數和三個用于顏色的浮點數,每個點有超過 200 個點來標記線的末端)。呼叫該函式一次不會產生任何結果,即使在使用SwapBuffers(HDC)and之后也是如此glFlush()。但是,當我兩次呼叫該函式時,一切都會顯示出來。我懷疑通過渲染管道推送緩沖區時我缺少一些細微差別,這可能通過多次系結緩沖區來激活。我不確定。有什么想法嗎?
uj5u.com熱心網友回復:
glVertexAttribPointer期望系結到GL_ARRAY_BUFFER系結點的緩沖區,以便在通用頂點屬性和緩沖區物件之間建立關聯,以從中獲取資料。
但是,glBindBuffer(GL_ARRAY_BUFFER, VBO2) 在呼叫glVertexAttribPointer.
這就是您需要兩次呼叫的原因,因為第一次呼叫不會將任何緩沖區物件與通用頂點屬性相關聯,因為之前可能沒有系結任何緩沖區。
然而,你使用 VAO 的方式是可疑的,因為你在這個方法/函式中所做的一切都已經被保存為 VAO 狀態。因此,您既不需要每次都重新建立通用頂點屬性和緩沖區物件之間的關聯,也不需要每次繪制時都啟用通用頂點屬性。
在為 VAO 進行頂點規范時,所有這些都可以一次性完成。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/483265.html
上一篇:GDI:創建山圖/圖形?
