簡體   English   中英

C ++ / OpenGL - 繪制一個立方體VBO

[英]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調用glEnableVertexAttribArrayglVertexAttribPointer是多余的。 您應該只在渲染功能中調用它們。

你的第二個問題是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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM