[英]OpenGL Indexed VBO Rendering
我在嘗試在OpenGL中繪制一個簡單的正方形時遇到了一個全黑屏幕。 這些方法在創建緩沖區之前被調用:
glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glOrtho(0.0f, windowX, windowY, 0.0f, 1000.0f, 0);
我正在像這樣創建緩沖區:
std::vector<unsigned int> indices;
std::vector<unsigned int> vertices;
vertices.push_back(0);
vertices.push_back(0);
vertices.push_back(0);
vertices.push_back(100);
vertices.push_back(0);
vertices.push_back(0);
vertices.push_back(100);
vertices.push_back(100);
vertices.push_back(0);
vertices.push_back(0);
vertices.push_back(100);
vertices.push_back(0);
indices.push_back(0);
indices.push_back(1);
indices.push_back(2);
indices.push_back(2);
indices.push_back(3);
indices.push_back(0);
glGenBuffers(1, &verticesbuffer);
glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW);
glGenBuffers(1, &indicesbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(indices[0]), &indices[0], GL_STATIC_DRAW);
顯示功能
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
glVertexPointer(3, GL_INT, 0, &vertices[0]);
glColor3f(1, 0, 0);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
我已開始使用AMD GPU PerfStudio查看程序的繪圖調用,並在glDrawElements()調用中,PerfStudio向我顯示了頂點和索引緩沖區后面的數據(索引緩沖區顯然完全為空,而頂點緩沖區只有一個點設置為x = y = z = 3.40282e + 038(最大浮點值):
Unable to map element array buffer for reading.
GL_VERTEX_ARRAY_SIZE: 3
GL_VERTEX_ARRAY_TYPE: GL_INT
GL_VERTEX_ARRAY_STRIDE: 0
GL_VERTEX_ARRAY_POINTER: 0x0C30F2A8
GL_VERTEX_ARRAY_BUFFER_BINDING: 1
BufferState
GL_BUFFER_SIZE: 0
GL_BUFFER_USAGE: GL_STATIC_DRAW
GL_BUFFER_ACCESS: GL_READ_WRITE
GL_BUFFER_MAPPED: GL_FALSE
GL_BUFFER_MAP_POINTER: 0x00000000
顯然,其中一些值是不正確的,我只是無法弄清楚為什么它們沒有按預期出現。
這一定是在之前提出的,但是我無法通過快速搜索找到清晰的重復項。
問題在這里:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
...
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
當GL_ELEMENT_ARRAY_BUFFER
一個期間被綁定glDrawElements()
調用,它是在代碼中的情況下,最后一個參數glDrawElements()
是偏移到索引緩沖器 。 您傳遞的是索引緩沖區的CPU地址。
如果要從頭開始使用索引緩沖區,這是正確的選擇,則偏移量應為0:
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
同樣,這也被破壞了:
glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
...
glVertexPointer(3, GL_INT, 0, &vertices[0]);
同樣,綁定GL_ARRAY_BUFFER
時, glVertexPointer()
的最后一個參數是緩沖區的偏移量。 所以這應該是:
glVertexPointer(3, GL_INT, 0, 0);
順便說一句,將整數用作頂點坐標在OpenGL中非常不常見。 看起來像它的支持,所以它應該工作。 但是,使用GLfloat
/ GL_FLOAT
作為坐標更為常見,並且可能更為有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.