0

I am rendering 2 sets of geometry using vertex buffer objects in OpenGL - one with textures and one without. I am not using the programmable pipeline because of legacy code.

What I find is that if I render the textured geometry first followed by the non-textured geometry, everything looks good. But if I do the reverse, the textured geometry is not drawn.

I am using interleaved arrays, and here is the rendering code:

void MyClass::render()
{

    // 3*v + 3*c + 3*n + (2*t)
    const char *base = NULL;
    GLsizei stride = _enableTexture ? 11*sizeof(GLfloat) : 9*sizeof(GLfloat);
    GLvoid* vOffset = (GLvoid*)0;
    GLvoid* cOffset = (GLvoid*)(3*sizeof(GLfloat));
    GLvoid* nOffset = (GLvoid*)(6*sizeof(GLfloat));
    GLvoid* tOffset = (GLvoid*)(9*sizeof(GLfloat));

    // prepare vertex VBO
    glBindBuffer(GL_ARRAY_BUFFER, _iBuffer);

    // enable vertex array
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, stride, vOffset);

    // enable color array
    glEnableClientState(GL_COLOR_ARRAY);
    glColorPointer(3, GL_FLOAT, stride, cOffset);

    // enable normal array
    glEnableClientState(GL_NORMAL_ARRAY);
    glNormalPointer(GL_FLOAT, stride, nOffset);

    // texture coords
    if(_enableTexture) {    
      // enable texture array
      glEnableClientState(GL_TEXTURE_COORD_ARRAY);
      glTexCoordPointer(2, GL_FLOAT, stride, tOffset);
    }

    // draw geometry
    glDrawArrays(GL_TRIANGLES, 0, _nVertices);      

    // disable/unbind
    glDisableClientState(GL_VERTEX_ARRAY);
    glDisableClientState(GL_COLOR_ARRAY);
    glDisableClientState(GL_NORMAL_ARRAY);

    if(_enableTexture) {
      glDisableClientState(GL_TEXTURE_COORD_ARRAY);
    }

    glBindBuffer(GL_ARRAY_BUFFER, 0);
}

This works:

myClassTextured->render();
myClassNonTextured->render();

This fails:

myClassNonTextured->render();
myClassTextured->render();

What am I doing wrong?

4

1 回答 1

1

要检查的两件事:

首先,如果_enableTexture为 false,则应禁用GL_TEXTURE_COORD_ARRAYin render()正如TalChristian已经指出的那样,你为什么不启用/禁用GL_TEXTURE_2Drender()?更容易理解和调试。

第二,你是如何分配的_iBuffer,之后可以_enableTexture改变吗?如所写,您的render()方法仅在_iBuffer为每个顶点分配 9 个浮点数时才有效,如果_enableTexture为假,则为 11 个如果为真。但是,如果您_iBuffer为纹理坐标分配了足够的空间,无论您是否最终使用它们,步幅值都应始终为 11。

于 2012-11-02T00:13:45.010 回答