我有一个示例代码,用三角形初始化一个VBO,然后渲染它。
我的主渲染循环是:
// Clear Color and Depth Buffers
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
// Reset transformations
glLoadIdentity();
// Set the camera
gluLookAt( x, 1.0f, z,
x+lx, 1.0f, z+lz,
0.0f, 1.0f, 0.0f);
// Draw ground
glColor3f(0.9f, 0.9f, 0.9f);
glBegin(GL_QUADS);
glVertex3f(-100.0f, 0.0f, -100.0f);
glVertex3f(-100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, 100.0f);
glVertex3f( 100.0f, 0.0f, -100.0f);
glEnd();
// draw triangle
glColor3f(0.9f, 0.2f, 0.1f);
glRotatef(angle, 0.0f, 1.0f, 0.0f);
if(vboTest) vboTest->draw();
/* The above ->draw() would be equivalent
to the following immediate mode
glBegin(GL_TRIANGLES);
glVertex3f(-1.0f, 0.2f, -1.0f);
glVertex3f(-1.0f, 0.2f, 1.0f);
glVertex3f( 1.0f, 0.2f, 1.0f);
glEnd();*/
vboTest 中包含的数据初始化时的值与上面注释的代码完全相同,但是当我使用以下代码进行渲染时
// bind vertexes and indexes
glBindBuffer(GL_ARRAY_BUFFER, vbos_[0]); // vertexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbos_[2]); // indexes
// do same as vertex array except pointer
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3, GL_FLOAT, 0, 0); // last param is offset, not ptr
// draw n_tris_ triangles using offset of index array
glDrawElements(GL_TRIANGLES, n_vertex_, GL_UNSIGNED_INT, 0);
// deactivate vertex array
glDisableClientState(GL_VERTEX_ARRAY);
// bind with 0, so, switch back to normal pointer operation
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
旋转时三角形似乎在旋转但是变形。当然,如果我要使用上面的立即模式代码,我可以看到没有问题的旋转三角形。
Aren的VBO应该表现出语义上等效的立即模式?我做错了什么?
答案 0 :(得分:1)
我发现了这个问题!
令人惊讶的是,在顶点声明期间,我错过了一个逗号。 我无法相信:
GLfloat v[] = { -1.0f, 0.2f, -1.0f // comma missing here!
-1.0f, 0.2f, 1.0f,
1.0f, 0.2f, 1.0f };
与this question几乎相同。
我无言以对!
干杯,
ë