簡體   English   中英

帶有 ebo 的 Opengl vao

[英]Opengl vao with ebo

我目前正在空閑時間學習 OpenGL,最近我遇到了一個我不明白的“錯誤”。

問題是,我沒有錯誤,屏幕上什么也沒有出現。 我將 OpenGL 與 SFML 一起使用。

這是我的代碼。 這是我的方法:

void CreateObjet(GLuint& vao, GLuint& vbo, GLuint& ebo, GLuint& textureLocation)

//I create my arrays here.. Don't worry they are fine.

CreateTexture(textureLocation);

glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);

glGenVertexArrays (1, &vao);
glBindVertexArray (vao); //On travaille dans le VAO

    glBindBuffer(GL_ARRAY_BUFFER, vbo);

        glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
        glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
        glEnableVertexAttribArray(0);

        glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
        glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3* sizeof(GLfloat)));
        glEnableVertexAttribArray(1);

        glBufferData (GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
        glVertexAttribPointer (2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6* sizeof(GLfloat)));
        glEnableVertexAttribArray(2);

        //EBO
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indiceFinal), indiceFinal, GL_STATIC_DRAW); 

glBindVertexArray(0);

我知道我的問題不在於我的着色器,因為我在使用 GlshaderRiv() 的控制台中沒有收到任何錯誤。

我想知道我的訂單是否正確。

  1. 我創建了一個 VBO 和一個 EBO
  2. 我創建了一個 VAO
  3. 我綁定當前的VAO來修改它
  4. 我在 VAO 內綁定當前的 VBO
  5. 我將我的第一個數組(頂點位置 vector3f)綁定到我的 VBO 中,並將它們放在第一個具有正確偏移量和步幅的指針中。
  6. 我將我的第二個數組(顏色位置 vector3f)綁定到我的 VBO 中,並將它們放在第一個具有正確偏移量和步幅的指針中。
  7. 我在我的 VBO 中綁定了我的第三個數組(紋理位置 vector2f),並將它們放在第一個具有正確偏移量和步幅的指針中。
  8. 我在 VAO 內綁定了一個 EBO
  9. 我將 EBO 與我的元素位置(矢量 3u)綁定。
  10. 我從內存中解除了 VAO 的綁定,因為我的繪圖循環在代碼中相當晚,所以,我不想白白使用內存空間。 別擔心,在我畫之前我放了 glBindVertexArray(&vao);

那看起來肯定不對。 您將所有屬性的值寫入同一個緩沖區,每個屬性都會覆蓋前一個:

glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);

glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
...

當你第二glBufferData()調用,它將覆蓋points ,您以前存儲在與緩沖區數據colors數據。

誤解可能是關於glVertexAttribPointer()作用。 它指定給定屬性來自哪個緩沖區,以及數據布局(組件計數、類型等)。 但它不會創建緩沖區數據的副本,或類似的東西。 在繪制調用時,您要使用的屬性數據仍必須存儲在緩沖區中。

要解決此問題,您必須為每個屬性使用不同的緩沖區,或者安排屬性數據,以便所有 3 個屬性的值都可以存儲在同一個緩沖區中。 您的glVertexAttribPointer()調用的參數實際上表明您打算將所有屬性值交錯存儲在同一緩沖區中。 要使其正常工作,您必須相應地安排屬性值,然后使用單個glBufferData()調用將它們存儲在緩沖區中。

為此,您需要的內存安排將依次包含第一個頂點的所有屬性值,然后是第二個頂點的值, cipi是頂點i的位置, ci是顏色, ti是紋理坐標,正確的內存布局是:

p0x p0y p0z c0r c0g c0b t0s t0t
p1x p1y p1z c1r c1g c1b t1s t1t
p2x p2y p2z c2r c2g c2b t2s t2t
...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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