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]);
当在 glDrawElements()
调用期间绑定 GL_ELEMENT_ARRAY_BUFFER
时(在您的代码中就是这种情况),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
作为坐标更常见,也可能更有效。
我尝试在 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]);
当在 glDrawElements()
调用期间绑定 GL_ELEMENT_ARRAY_BUFFER
时(在您的代码中就是这种情况),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
作为坐标更常见,也可能更有效。