2014-02-15 144 views
3

最近我開始學習OpenGL,並開始學習它的新資產。一段時間以來,我一直試圖與VBO合作,從頂點數組中繪製一個簡單的立方體。我很難渲染它並理解函數中的一些參數。它不會拋出任何錯誤,但我認爲沒有任何錯誤。C++/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); 
+0

您可能有不正確的矩陣。 ModelView作爲身份不正確。另外,停止使用固定管道。它在新的GL中已被棄用,您聲稱它的目標。 –

回答

2

你是不是所有的數據轉移到頂點緩衝。 glBufferData的第二個參數以字節爲單位計算所有頂點數據的大小。您應該將其設置爲sizeof(vertex) * vertex_count

另外,在loadBufferData中調用glEnableVertexAttribArrayglVertexAttribPointer是多餘的。你應該只在你的渲染函數中調用它們。

你的第二個問題是glVertexAttribPointer。您沒有將正確的偏移量傳遞給頂點數據「結構」中的頂點位置數據。由於您的頂點僅包含位置,因此此偏移應爲0。如果每個頂點都有位置和顏色,則這些偏移量可能爲0(對於位置)和sizeof(float) * 3(對於顏色,因爲您有3個座標)。

最後,你只畫一個單個的頂點。如果您的立方體有頂點24,則應繪製72/3=24

我想你可以通過定義一個實際的結構,爲您的頂點,像這樣讓您的生活更輕鬆:

struct Vertex 
{ 
    float position[3]; 
}; 

然後,你可以計算偏移量爲每個頂點位置,顏色等,與(GLvoid*)(&((Vertex*)NULL)->position)