OpenGL顶点缓冲对象以及纹理与非纹理几何的排序

时间:2012-11-01 07:07:56

标签: opengl

我使用OpenGL中的顶点缓冲对象渲染2组几何图形 - 一个具有纹理,一个没有。由于遗留代码,我没有使用可编程管道。

我发现如果我首先渲染纹理几何体,然后是非纹理几何体,那么一切看起来都很好。但如果我反过来,则不会绘制纹理几何体。

我正在使用交错数组,这里是渲染代码:

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

这有效:

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

这失败了:

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

我做错了什么?

1 个答案:

答案 0 :(得分:1)

要检查两件事:

首先,如果_enableTexture为假,则应在GL_TEXTURE_COORD_ARRAY中停用render()。正如 Tal Christian 已经指出的那样,为什么不在GL_TEXTURE_2D启用/禁用render()?更容易理解和调试。

其次,您如何分配_iBuffer并且之后可以_enableTexture更改?如上所述,render()方法仅在_iBuffer为每个垂直分配9个浮点数时才有效,如果_enableTexture为假,则为11,如果为真。但是如果为_iBuffer分配足够的纹理坐标空间,无论你是否真的最终使用它们,步幅值应始终为11。