【问题标题】:Using VBOs to render a square使用 VBO 渲染正方形
【发布时间】:2012-11-08 23:22:27
【问题描述】:

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

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

【问题讨论】:

  • 从我可以从各种各样的教程中收集到的信息”我从未见过任何教程认可该代码或类似的东西。
  • @MeDiCS - 我只是在猜测,但我不确定是否允许您设置指向尚未创建的缓冲区的指针。在调用 glBufferData 之前不会分配内存,因此 glVertexPointer 将无法存储指向内存的指针,因为它还不存在。我建议尝试将 glBufferData 放在 glVertexPointer 之前。当你的代码不工作时,你也应该使用glGetError
  • @Tim:OpenGL 正在接受每一个命令——所有调用都用一个检查错误的宏包装。此外,在 glBufferData 之后移动 glVertexPointer 也不起作用。

标签: opengl vbo opengl-3


【解决方案1】:

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

希望这会有所帮助...

【讨论】:

  • 嗯,解除绑定和重新绑定缓冲区不会改变任何东西,而且我在渲染代码中看不到任何我可能错过的东西。 OpenGL初始化可能不一样?
  • 不,但我猜 SDL 已经这样做了。不管怎样,当我使用glBegin/glEnd...
  • SDL 用于创建窗口和 GL 上下文,以及用于 OpenGL 本身的 Glew。
【解决方案2】:

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

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0);

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

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多