2011-06-20 48 views
8

代碼的核心(顯示紅色矩形):繪圖VBO與調用glDrawArrays工作在OpenGL 2.1但不在OpenGL 3.X

//bind program, set uniforms, bind vbo 
glEnableVertexAttribArray(0); 
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0,0); 
glDrawArrays(GL_TRIANGLES, 0, 6); 
glDisableVertexAttribArray(0); 
//unbind vbo, unbind program 

當我將上下文切換到OpenGL的3.x的這個代碼將停止工作(我只能看到背景的顏色),但是當我用上面的代碼以相同的方式初始化VAO,然後我綁定VAO並調用glDrawArrays時,它就可以工作。

可能是什麼問題?如何在不使用VAO的情況下繪製VBO?

(着色器是非常簡單的,VS僅mulitplies矩陣和ps輸出紅色)

回答

7

讓我們在OpenGL的3芯規格一看:

2.10

第一段:

緩衝對象要由收集在一起的GL是 的頂點階段使用 以形成頂點 數組對象。所有與頂點 處理器使用的數據定義 相關的狀態被封裝在頂點 數組對象中。

最後一段:

產生無效操作錯誤 如果任何*指針 命令的指定而零被綁定到 被 調用的位置和 組織頂點數組數據的ARRAY BUFFER緩衝區對象綁定 指向,而指針參數是 不是NULL³。

而在³腳註:

此錯誤使得不能創建包含客戶端陣列指針, 同時仍然允許緩衝對象是未結合的頂點數組對象。

或者換句話說:在OpenGL的3芯必須使用VAOs

+0

我認爲VAO的是可選的。 (我的代碼不會引發任何錯誤)。那麼我應該如何使用VAO? 1 VAO = 1型號? – chris

+0

暫時我會用一個全球VAO。 – chris

+4

您可以在一個VAO中收集多個模型。我通常會收集類似屬性的網格,這些網格總是在VAO中一起出現。例如,使用相同着色器的遊戲引擎地圖的所有靜態元素都可以在一個VAO中收集。按照着色器和材質屬性排序可能是最好的排序標準,我會說。 – datenwolf