簡體   English   中英

OpenGL索引的VBO渲染

[英]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.

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