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
作为坐标更常见,也可能更有效。
相关文章:
- OpenGL将纹理四边形渲染为(0,0)
- 按需渲染帧
- 使用专用显卡进行 OpenGL 渲染时帧速率较低
- OpenGL VBO Indexing ( How to compute Index Array)
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- dx11 渲染到纹理仅显示透明颜色
- 在 opengl 中渲染 obj 文件时出现黑窗口
- QT QOpenGLWidget:如何在不使用数据块复制的情况下修改VBO中的单个顶点值?
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- VBO渲染缓慢
- 使用客户端顶点阵列在没有VBO的情况下在opengl 3.1+中进行渲染
- 如何在渲染 VBO 后仅更改纹理坐标?
- OpenGL 使用单个 VBO 渲染多个对象,并使用另一个 VBO 渲染 updata 对象的矩阵
- C++ VBO 渲染问题
- 纹理渲染和 VBO 的 [OpenGL/SDL/C++]
- OpenGL索引VBO渲染
- 用顶点缓冲对象(VBO)渲染Kinect点云
- QThread在GUI事件上调用glBufferData()时不更新OpenGL vbo和不渲染任何东西
- 使用VAO/VBO的OpenGL模型/纹理渲染
- 混合VBO和非VBO渲染的Opengles提供EXC_BAD_ACCESS