[英]C++/OpenGL - Drawing a cube VBO
最近我開始學習OpenGL,我開始學習它的新資產。 有一段時間我一直在嘗試使用VBO,從頂點數組中繪制一個簡單的立方體。 我無法渲染它並理解函數中的一些參數。 它沒有引起任何錯誤,但我認為沒有任何錯誤。
float cubeVertPoints[72]; //An array containing the vertex points
這是我的VBO初始化
void loadBufferData()
{
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertPoints[0])*3, &cubeVertPoints[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));
}
畫畫
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));
glDrawArrays(GL_TRIANGLES, 0, 1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
您沒有將所有數據傳輸到頂點緩沖區。 glBufferData
的第二個參數采用所有頂點數據的大小(以字節為單位)。 您應該將其設置為sizeof(vertex) * vertex_count
。
此外,在loadBufferData
調用glEnableVertexAttribArray
和glVertexAttribPointer
是多余的。 您應該只在渲染功能中調用它們。
你的第二個問題是glVertexAttribPointer
。 您沒有將正確的偏移量傳遞給頂點數據“結構”中的頂點位置數據。 由於頂點僅由位置組成,因此此偏移量應為0
。 如果你有每個頂點的位置和顏色,這些偏移可以是0
(對於位置)和sizeof(float) * 3
(對於顏色,因為你有3個坐標)。
最后,你只能得出一個頂點。 如果您的立方體有24
個頂點,則應繪制72/3=24
。
我認為通過為頂點定義實際結構可以讓您的生活更輕松,如下所示:
struct Vertex
{
float position[3];
};
然后,您可以使用(GLvoid*)(&((Vertex*)NULL)->position)
計算每個頂點位置,顏色等的偏移量。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.