最近我开始学习 OpenGL 并且我开始学习它的新 Assets 。一段时间以来,我一直在尝试使用 VBO,从顶点数组绘制一个简单的立方体。我在渲染它和理解函数中的一些参数时遇到了问题。它没有抛出任何错误,但我认为没有任何错误。
float cubeVertPoints[72]; //An array containing the vertex points
这是我的 VBO 初始化
void loadBufferData()
{
glGenBuffers(1, &cubeVBO);
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(cubeVertPoints[0])*3, &cubeVertPoints[0], GL_STATIC_DRAW);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));
}
绘图
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(-ratio, ratio, -1.f, 1.f, 1.f, -1.f);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glBindBuffer(GL_ARRAY_BUFFER, cubeVBO);
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(cubeVertPoints[0])*3, (void*)sizeof(GL_FLOAT));
glDrawArrays(GL_TRIANGLES, 0, 1);
glDisableVertexAttribArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
最佳答案
您并未将所有数据传输到顶点缓冲区。 glBufferData
的第二个参数采用以字节为单位的所有顶点数据的大小。您应该将其设置为 sizeof(vertex) * vertex_count
。
此外,在 loadBufferData
中调用 glEnableVertexAttribArray
和 glVertexAttribPointer
是多余的。您应该只在渲染函数中调用它们。
您的第二个问题是 glVertexAttribPointer
。您没有将正确的偏移量传递给顶点数据“结构”中的顶点位置数据。由于您的顶点仅包含位置,因此此偏移量应为 0
。如果每个顶点都有位置和颜色,这些偏移量可以是 0
(对于位置)和 sizeof(float) * 3
(对于颜色,因为您有 3 个坐标).
最后,您只绘制一个单个 顶点。如果您的立方体有 24
个顶点,您应该绘制 72/3=24
。
我认为你可以通过为你的顶点定义一个实际的结构来让你的生活更轻松,就像这样:
struct Vertex
{
float position[3];
};
然后,您可以使用 (GLvoid*)(&((Vertex*)NULL)->position)
计算每个顶点位置、颜色等的偏移量。
关于C++/OpenGL - 绘制立方体 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21800676/