2012-11-08 54 views
1

我在理解如何使用VBOs方面遇到了一些麻烦。我一直试图让图像相当于:使用VBOs渲染正方形

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

导致一个白色正方形。使用维也纳各组织,从我可以从教程的分类收集,应更改代码以:

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

然而,这并未使任何东西。

+0

“*从我可以从各种各样的教程中收集*”我从来没有见过任何教程认可代码或类似的东西。 –

+0

@MeDiCS - 我只是猜测,但我不确定是否可以设置指向尚未创建的缓冲区的指针。在调用glBufferData之前不分配内存,因此glVertexPointer将不能存储指向内存的指针,因为它尚不存在。我建议尝试在glVertexPointer之前放置glBufferData。当你的代码不工作时,你应该使用'glGetError'。 – Tim

+0

@Tim:OpenGL正在接受每一个命令---所有调用都包含一个检查错误的宏。另外,在'glBufferData'之后移动'glVertexPointer'不起作用。 – moatPylon

回答

1

发现了什么我的错误了。这一呼吁:

glDrawElements (GL_TRIANGLES, 2, GL_UNSIGNED_INT, 0); 

要求的OpenGL画一个三角形,两个顶点,而不是两个三角形有三个顶点每个像我想象的。正确的电话是:

glDrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); 
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); 

希望这有助于...

+0

嗯,解除绑定和重新绑定缓冲区不会改变任何东西,并且在我可能错过的渲染代码中看不到任何东西。 OpenGL初始化可能有所不同? – moatPylon

+0

您是否在3D渲染中完成了gldepthtest? –

+0

不,但我想SDL已经这样做了。无论哪种方式,当我使用'glBegin' /'glEnd'时,它确实可行... – moatPylon