C++/OpenGL - 绘制立方体 VBO
Posted
技术标签:
【中文标题】C++/OpenGL - 绘制立方体 VBO【英文标题】:C++/OpenGL - Drawing a cube VBO 【发布时间】:2014-02-15 16:55:10 【问题描述】:最近我开始学习 OpenGL,并且开始学习它的新资产。一段时间以来,我一直在尝试使用 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);
【问题讨论】:
您的矩阵可能不正确。作为 Identity 的 ModelView 看起来不正确。另外,停止使用固定管道。它在您声称要定位的较新 GL 中已弃用。 【参考方案1】:您没有将所有数据传输到顶点缓冲区。 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的主要内容,如果未能解决你的问题,请参考以下文章