Opengl 使用VBOs渲染正方形
我在理解VBO是如何使用的方面有点困难。我一直在尝试获得一个相当于以下内容的图像: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
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渲染系统提供数据,但您需要握住他的手并带他穿过它
希望这有助于……找出我的错误所在。此电话:
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);