Opengl 使用VBOs渲染正方形

Opengl 使用VBOs渲染正方形,opengl,vbo,opengl-3,Opengl,Vbo,Opengl 3,我在理解VBO是如何使用的方面有点困难。我一直在尝试获得一个相当于以下内容的图像: glMatrixMode (GL_PROJECTION); glLoadIdentity (); gluPerspective (70, 4.0f / 3, 1, 1000); glMatrixMode (GL_MODELVIEW); glLoadIdentity (); gluLookAt (0, 0, -5, 0, 0, 0, 0, 1, 0); glBe

我在理解VBO是如何使用的方面有点困难。我一直在尝试获得一个相当于以下内容的图像:

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (70, 4.0f / 3, 1, 1000);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

gluLookAt (0, 0, -5,
           0, 0,  0,
           0, 1,  0);

glBegin (GL_TRIANGLES);
glVertex3f (-1, -1, -1);
glVertex3f (1, -1, -1);
glVertex3f (1, 1, -1);
glVertex3f (-1, -1, -1);
glVertex3f (1, 1, -1);
glVertex3f (-1, 1, -1);
glEnd ();
结果是一个白色的正方形。使用VBOs,从我从各种教程中收集到的信息,应将代码更改为:

float vertexes[][3] = {
    { 1,  1, -1},
    { 1, -1, -1},
    {-1,  1, -1},
    {-1, -1, -1},
};

unsigned int indexes[] = {
    3, 1, 0,
    3, 0, 2,
};

GLuint vbo, ibo;

glGenBuffers (1, &vbo);
glBindBuffer (GL_ARRAY_BUFFER, vbo);
glEnableClientState (GL_VERTEX_ARRAY);
glVertexPointer (3, GL_FLOAT, 0, 0);

glGenBuffers (1, &ibo);
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER, ibo);

glMatrixMode (GL_PROJECTION);
glLoadIdentity ();
gluPerspective (70, 4.0f / 3, 1, 1000);

glMatrixMode (GL_MODELVIEW);
glLoadIdentity ();

gluLookAt (0, 0, -5,
       0, 0,  0,
       0, 1,  0);

glBufferData (GL_ARRAY_BUFFER, sizeof vertexes, vertexes, GL_STATIC_DRAW);
glBufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof indexes, indexes, GL_STATIC_DRAW);

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);

但是,这不会渲染任何内容。

VBO用于向OpenGL渲染系统提供数据,但您需要握住他的手并带他穿过它

  • 告诉他需要绘制哪些顶点以及这些顶点的笛卡尔坐标。 你做得对

  • 接下来你需要告诉他怎么做。这是由数组索引数组完成的。这也是你正确的做法

  • 但我有一种感觉,这是因为在连续调用glBindBuffer()之间,您没有清除缓冲区,因此很难将其放入哪个缓冲区

    请看这个样品(我写的)


    希望这有助于……

    找出我的错误所在。此电话:

    glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);
    
    让OpenGL画一个有两个顶点的三角形,而不是像我想的那样画两个有三个顶点的三角形。正确的呼叫是:

    glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
    

    “根据我从各种教程中收集到的信息”我从未见过任何教程支持该代码或类似的内容。@MeDiCS-我只是猜测,但我不确定是否允许您设置指向尚未创建的缓冲区的指针。在调用glBufferData之前不会分配内存,因此glVertexPointer将无法存储指向内存的指针,因为它还不存在。我建议尝试将glBufferData放在glVertexPointer之前。当你的代码不工作时,你也应该使用
    glGetError
    。@Tim:OpenGL正在接受每一个命令---所有调用都用一个检查错误的宏包装。另外,在
    glBufferData
    之后移动
    glvertexinter
    也不起作用。嗯,解除绑定和重新绑定缓冲区不会改变任何东西,而且我在渲染代码中看不到任何可能遗漏的东西。OpenGL初始化可能不同?不,但我想SDL已经做到了。无论哪种方式,当我使用
    glBegin
    /
    glEnd
    ..SDL来创建窗口和GL上下文,以及为OpenGL本身创建Glew时,它都会起作用。
    glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);
    
    glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);