2012-11-01 56 views
0

我使用OpenGL中的顶点缓冲区对象渲染两组几何体 - 一个是纹理,另一个是没有纹理。由于遗留代码,我没有使用可编程管道。OpenGL顶点缓冲区对象和纹理与非纹理几何图形的排序

我发现的是,如果我先渲染纹理几何图形,然后再渲染非纹理几何图形,一切看起来都不错。但是如果我做相反的话,纹理几何图形就不会绘制出来。

我使用的交错阵列,这里是渲染代码:

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

听起来像一个很好的旧*“OpenGL是一个状态机”* - 问题。 –

+0

你的代码在哪里绑定纹理本身?我敢打赌,它被绑定在通话之前,然后它在第一次渲染之后解除绑定并且不再被绑定。 (或者也可能以类似的方式打开/关闭另一个OpenGL状态。) –

+0

请显示其余代码。尤其是启用和绑定纹理,调用'MyClass :: render'等等。当然,你的'render'函数不会告诉任何人,因为它没有做任何与纹理有关的事情。 –

回答

1

两件事情来检查:

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

二,您如何分配_iBuffer并可以在_enableTexture之后更改?如书面所述,如果_enableTexture为假,_iBuffer分配9个浮点数,如果为真,则render()方法仅适用。但是如果你为纹理坐标分配_iBuffer有足够的空间,无论你是否真的最终使用它们,步长值应该总是11.

+0

+1的步幅。听起来很不错。 –

相关问题