[英]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() 的控制台中沒有收到任何錯誤。
我想知道我的訂單是否正確。
那看起來肯定不對。 您將所有屬性的值寫入同一個緩沖區,每個屬性都會覆蓋前一個:
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()
調用將它們存儲在緩沖區中。
為此,您需要的內存安排將依次包含第一個頂點的所有屬性值,然后是第二個頂點的值, ci
。 pi
是頂點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.