VBO 与立即模式 (glBegin/glEnd) 的行为是不是存在任何行为差异? [关闭]

Posted

技术标签:

【中文标题】VBO 与立即模式 (glBegin/glEnd) 的行为是不是存在任何行为差异? [关闭]【英文标题】:Should there be any behavioural differece in behaviour for VBO vs immediate mode (glBegin/glEnd)? [closed]VBO 与立即模式 (glBegin/glEnd) 的行为是否存在任何行为差异? [关闭] 【发布时间】:2016-03-21 13:30:52 【问题描述】:

我有一个示例代码,它用三角形初始化 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);

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

VBO 不应该表现在语义上等效的 立即 模式吗?我做错了什么?

【问题讨论】:

【参考方案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一样。 我无语了!

干杯, E

【讨论】:

以上是关于VBO 与立即模式 (glBegin/glEnd) 的行为是不是存在任何行为差异? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL几种绘制方式

OpenGL 和 C++:glBegin/glEnd

OpenGL 在渲染帧之前崩溃 - VBO

API OpenGL输出土元函数及相关子程序

我需要建议如何改进图形

VBO 与即时模式性能