最近我开始学习OpenGL,我开始学习它的新资产。有一段时间我一直在尝试使用VBO,从顶点数组中绘制一个简单的立方体。我无法渲染它并理解函数中的一些参数。它没有引起任何错误,但我认为没有任何错误。
float cubeVertPoints[72]; //An array containing the vertex points
这是我的VBO init
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);
答案 0 :(得分:2)
您没有将所有数据传输到顶点缓冲区。 glBufferData
的第二个参数采用所有顶点数据的大小(以字节为单位)。您应该将其设置为sizeof(vertex) * vertex_count
。
此外,在glEnableVertexAttribArray
中调用glVertexAttribPointer
和loadBufferData
是多余的。你应该只在渲染函数中调用它们。
你的第二个问题是glVertexAttribPointer
。您没有将正确的偏移量传递给顶点数据中的顶点位置数据"结构"。由于您的顶点仅由位置组成,因此此偏移量应为0
。如果你有每个顶点的位置和颜色,这些偏移可以是0
(对于位置)和sizeof(float) * 3
(对于颜色,因为你有3个坐标)。
最后,您只绘制单个顶点。如果您的多维数据集具有72/3=24
个顶点,则应绘制24
。
我认为通过为顶点定义实际结构可以让您的生活更轻松,例如:
struct Vertex
{
float position[3];
};
然后,您可以使用(GLvoid*)(&((Vertex*)NULL)->position)
计算每个顶点位置,颜色等的偏移量。