C++ OpenGL索引VBO渲染

C++ OpenGL索引VBO渲染,c++,opengl,vbo,C++,Opengl,Vbo,当我试图在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;

当我试图在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);
我已经开始使用AMD GPU PerfStudio查看我的程序的绘图调用,在glDraweElements()调用中,PerfStudio向我显示顶点和索引缓冲区后面的数据(索引缓冲区显然是完全空的,而顶点缓冲区只有一个点设置为x=y=z=3.40282e+038(最大浮点值)):


显然,其中一些值是不正确的,我只是不明白为什么它们没有按预期的那样出现。

这肯定是以前出现过的,但我无法通过快速搜索找到清晰的副本

问题在于:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
...
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
当在
glpaurements()
调用期间绑定了
GL\u元素\u数组\u缓冲区时(在代码中就是这种情况),
glpaurements()
的最后一个参数是索引缓冲区的偏移量。您传递的是索引缓冲区的CPU地址

如果您想从索引缓冲区的开始使用它,这在您的情况下是正确的,那么偏移量应该是0:

glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
同样,这一点也被打破了:

glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
...
glVertexPointer(3, GL_INT, 0, &vertices[0]);
同样,当绑定
GL\u数组\u缓冲区时,
glvertexpinter()
的最后一个参数是缓冲区中的偏移量。所以这应该是:

glVertexPointer(3, GL_INT, 0, 0);

顺便说一句,在OpenGL中使用整数作为顶点坐标是非常不寻常的。它看起来是受支持的,所以应该可以工作。但是使用
GLfloat
/
GL\u FLOAT
作为坐标更为常见,也可能更为有效。

这肯定是以前出现过的,但我无法通过快速搜索找到清晰的副本

问题在于:

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);
...
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, &indices[0]);
当在
glpaurements()
调用期间绑定了
GL\u元素\u数组\u缓冲区时(在代码中就是这种情况),
glpaurements()
的最后一个参数是索引缓冲区的偏移量。您传递的是索引缓冲区的CPU地址

如果您想从索引缓冲区的开始使用它,这在您的情况下是正确的,那么偏移量应该是0:

glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
同样,这一点也被打破了:

glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
...
glVertexPointer(3, GL_INT, 0, &vertices[0]);
同样,当绑定
GL\u数组\u缓冲区时,
glvertexpinter()
的最后一个参数是缓冲区中的偏移量。所以这应该是:

glVertexPointer(3, GL_INT, 0, 0);

顺便说一句,在OpenGL中使用整数作为顶点坐标是非常不寻常的。它看起来是受支持的,所以应该可以工作。但是使用
GLfloat
/
GL\u FLOAT
作为坐标更为常见,也可能更为有效。

在更改了GL抽屉元素()调用之后,我仍然得到了同样的结果。@ArcaneEnforce还有第二个类似的问题。请参阅更新。这将GL_VERTEX_ARRAY_指针的值更改为0x00000000,我认为这是正确的,但它仍然无法渲染多边形,并给了我“无法映射元素数组缓冲区以进行读取”。在更改GL抽屉元素()调用后,我仍然得到相同的结果。@ArcaneEnforcer还有第二个类似的问题。请参阅更新。这将GL_VERTEX_ARRAY_指针的值更改为0x00000000,我认为这是正确的,但它仍然无法渲染多边形,并使我“无法映射元素数组缓冲区以进行读取”