VBO与立即模式(glBegin / glEnd)的行为是否存在任何行为差异? [英] Should there be any behavioural differece in behaviour for VBO vs immediate mode (glBegin/glEnd)?

查看:707
本文介绍了VBO与立即模式(glBegin / glEnd)的行为是否存在任何行为差异?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我的主要渲染循环是:

  //清除颜色和深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
//重置转换
glLoadIdentity();
//设置摄像机
gluLookAt(x,1.0f,z,
x + lx,1.0f,z + lz,
0.0f,1.0f,0.0f) ;
//绘制地面
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();
//绘制三角形
glColor3f(0.9f,0.2f,0.1f);
glRotatef(angle,0.0f,1.0f,0.0f);
if(vboTest)vboTest-> draw();
/ *上面的> draw()将等价于
到下面的立即模式
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顶点和索引
glBindBuffer(GL_ARRAY_BUFFER,vbos_ [0]); // vertexes
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,vbos_ [2]); // indices
//与顶点数组相同,除了指针
glEnableClientState(GL_VERTEX_ARRAY); // activate vertex coords array
glVertexPointer(3,GL_FLOAT,0,0); // last param is offset,not ptr
//使用索引数组的偏移量绘制n​​_tris_三角形
glDrawElements(GL_TRIANGLES,n_vertex_,GL_UNSIGNED_INT,0);
//停用顶点数组
glDisableClientState(GL_VERTEX_ARRAY);
//绑定为0,因此,切换回正常的指针操作
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,0);

三角形似乎旋转,但在旋转时发生变形。< br>当然,如果我要使用上面的立即模式代码,我可以看到一个旋转三角形没有问题。



t VBO应该在语义上等效于立即模式吗?



解决方案

>令人惊讶的是,在顶点声明期间,我缺少一个逗号。
我不敢相信:

  GLfloat v [] = {-1.0f,0.2f,-1.0 f //逗号丢失这里! 
-1.0f,0.2f,1.0f,
1.0f,0.2f,1.0f};

几乎与
我是无语的!



干杯,

E


I have a sample code which initialize a VBO with a triangle and then renders it.

My main rendering loop is:

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

The data contained in vboTest is initialized with exactly the same values as the commented code above, but then when I render it with following code

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

The triangle appear to be rotating but is being deformed whilst spinning.
Of course, if I'm to use the immediate mode code above, I can see a spinning triangle without issues.

Aren't VBO supposed to behave semantically equivalent immediate mode? What am I doing wrong?

解决方案

I found the issue!

Surprisingly, during vertex declarations, I was missing one comma. I can't believe it:

GLfloat v[] = { -1.0f, 0.2f, -1.0f // comma missing here!
                -1.0f, 0.2f,  1.0f,
                1.0f, 0.2f,  1.0f };

Almost the same as this question.
I'm speechless!

Cheers,
E

这篇关于VBO与立即模式(glBegin / glEnd)的行为是否存在任何行为差异?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆