【发布时间】: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也不起作用。