Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++/OpenGL-用VBO绘制立方体_C++_Opengl_Vbo - Fatal编程技术网

C++ C++/OpenGL-用VBO绘制立方体

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

最近,我开始学习OpenGL,并开始学习它的新特性。一段时间以来,我一直在尝试使用VBOs,从顶点数组绘制一个简单的立方体。我在渲染它和理解函数中的一些参数时遇到困难。它不会出错,但在我看来什么都不是

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中,它已被弃用。