C++/OpenGL-用VBO绘制立方体
C++/OpenGL - Drawing a cube VBO
最近我开始学习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);
您没有将所有数据传输到顶点缓冲区。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)
计算每个顶点位置、颜色等的偏移。
相关文章:
- 如何使用 std::累积在 C++ 中计算总和立方体
- QuadTree只在窗口的右上角绘制
- Opengl 和 c++ 绘制多个立方体
- 为什么在GLFW窗口中没有用这个代码在我的屏幕上绘制立方体
- 在版本 440 核心中绘制具有纹理的立方体的顶点和片段着色器应该是什么
- C++/OpenGL-用VBO绘制立方体
- 如何使用 glDrawElements() 绘制硬表面立方体
- 在 OpenGL 中绘制立方体。迭代代码较短,但不起作用
- 如何绘制一个所有面都有不同纹理的立方体
- 在 OpenGL 中绘制一个实体立方体
- 使用鼠标在 Opengl 中绘制一个立方体
- OpenGL 3.2+ 围绕现有顶点绘制立方体
- 如何使用glDrawElements在OpenGL中绘制立方体
- OpenGL -当我在立方体上绘制边界时,会出现额外的线
- 在c++中绘制填充立方体,崩溃,没有有用的错误可以跟踪
- SFML + OpenGL:无法绘制立方体
- c++ OpenGL, GLFW绘制一个简单立方体
- c++旋转立方体坐标(非绘制)
- 如何在某些世界坐标下绘制立方体,OpenGL
- D3D9从Vertexbuffer绘制100k立方体非常慢