C++ C++/OpenGL-用VBO绘制立方体
最近,我开始学习OpenGL,并开始学习它的新特性。一段时间以来,我一直在尝试使用VBOs,从顶点数组绘制一个简单的立方体。我在渲染它和理解函数中的一些参数时遇到困难。它不会出错,但在我看来什么都不是C++ C++/OpenGL-用VBO绘制立方体,c++,opengl,vbo,C++,Opengl,Vbo,最近,我开始学习OpenGL,并开始学习它的新特性。一段时间以来,我一直在尝试使用VBOs,从顶点数组绘制一个简单的立方体。我在渲染它和理解函数中的一些参数时遇到困难。它不会出错,但在我看来什么都不是 float cubeVertPoints[72]; //An array containing the vertex points 这是我的VBO初始化 void loadBufferData() { glGenBuffers(1, &cubeVBO); glBindBu
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\u count
此外,在loadBufferData
中调用GlenableVertexAttributeArray
和GlVertexAttributePointer
也是多余的。您应该只在渲染函数中调用它们
第二个问题是glvertexattributepointer
。您没有在顶点数据“结构”中向顶点位置数据传递正确的偏移。由于顶点仅由位置组成,因此此偏移应为0
。如果每个顶点都有位置和颜色,这些偏移可以是0
(对于位置)和sizeof(float)*3
(对于颜色,因为您有3个坐标)
最后,只绘制一个单个顶点。如果立方体有24个
顶点,则应绘制72/3=24
我认为,通过为顶点定义实际结构,可以使您的生活更轻松,如下所示:
struct Vertex
{
float position[3];
};
然后,您可以使用
(GLvoid*)(&((vertex*)NULL)->position)计算每个顶点位置、颜色等的偏移量您的矩阵可能不正确。作为标识的ModelView看起来不正确。另外,停止使用固定管道。在您声称的目标较新的GL中,它已被弃用。