1

我在理解如何使用 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 ();

这导致一个白色的正方形。根据我从各种教程中收集到的信息,使用 VBO 应该将代码更改为:

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);

但是,这不会渲染任何东西。

4

2 回答 2

2

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

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

  2. 接下来你需要告诉他如何做到这一点。这是由数组索引数组完成的。这也是您正确完成的。

但我有一种感觉,这是因为在连续调用 glBindBuffer() 之间你没有清除缓冲区,所以它很难将它放入哪个缓冲区。

请看这个样本(我写的)

void InitVBO() 
{
    glGenBuffers(noOfVBO, vboHandle);   // create an interleaved VBO object
    for(int i =0;i<noOfVBO;i++)
    {
        glBindBuffer(GL_ARRAY_BUFFER, vboHandle[i]);   // bind the first handle 
        glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*masterNumberVertices[i], masterSolidVertex[i], GL_STATIC_DRAW); // allocate space and copy the position data over
        glBindBuffer(GL_ARRAY_BUFFER, 0);   // clean up 
        glGenBuffers(1, &indexVBO[i]); 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO[i]); 
        glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*masterNumberIndices[i], masterSolidIndices[i], GL_STATIC_DRAW);  // load the index data 
        glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);  // clean up
    } 
  // by now, we moved the position and color data over to the graphics card. There will be no redundant data copy at drawing time 
}

这就是方形绘图程序。

//Draw Cube 
  glBindBuffer(GL_ARRAY_BUFFER, vboHandle[3]); 
  glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexVBO[3]); 
  glVertexPointer(4,GL_FLOAT, sizeof(Vertex),(char*) NULL+0); 
  glNormalPointer(GL_FLOAT, sizeof(Vertex),(char*) NULL+16); 
  glColorPointer(4,GL_FLOAT,  sizeof(Vertex),(char*) NULL+32);
  glMatrixMode(GL_PROJECTION); 
  glLoadIdentity(); 
  gluPerspective(60, 1, .1, 100); 
  glMatrixMode(GL_MODELVIEW); 
  glLoadIdentity(); 
  gluLookAt(5,0,0,0,0,0,0,0,1); 
  glRotatef(x_angle, 0, 0,1); 
  glRotatef(y_angle, 0,1,0); 
  glScalef(scale_size, scale_size, scale_size); 
  glTranslatef(0,-1.5,-1.5);
  //glScalef(1,5,5); 
  glDrawElements(GL_QUADS, masterNumberIndices[3], GL_UNSIGNED_INT, (char*) NULL+0);

希望这可以帮助...

于 2012-11-08T23:49:38.350 回答
1

找出我的错误是什么。这个电话:

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);

要求 OpenGL 绘制一个带有两个顶点的三角形,而不是像我想的那样绘制两个带有三个顶点的三角形。正确的调用是:

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);
于 2012-11-09T11:15:49.517 回答