0

OpenGLの頂点バッファオブジェクトを使用して2セットのジオメトリをレンダリングしています。1つはテクスチャあり、もう1つはテクスチャなしです。レガシーコードのため、プログラム可能なパイプラインを使用していません。

私が見つけたのは、最初にテクスチャジオメトリをレンダリングし、次に非テクスチャジオメトリをレンダリングすると、すべてが良好に見えるということです。しかし、逆にすると、テクスチャジオメトリは描画されません。

インターリーブされた配列を使用しています。レンダリングコードは次のとおりです。

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

私は何が間違っているのですか?

4

1 に答える 1

1

2 つの確認事項:

まず、_enableTextureが false の場合は で無効GL_TEXTURE_COORD_ARRAYにする必要がありますrender()TalChristianが既に指摘したように、なぜ有効化/無効化しないGL_TEXTURE_2Dのですrender()か? 理解とデバッグがはるかに簡単です。

第二に、どのように割り当てており、後で変更_iBufferできますか? _enableTexture書かれているように、render()メソッドは、_iBuffer頂点ごとに 9 つの float が割り当てられている場合にのみ機能し_enableTextureます。しかし、_iBuffer実際にテクスチャ座標を使用するかどうかにかかわらず、テクスチャ座標に十分なスペースを割り当てれば、ストライド値は常に 11 になります。

于 2012-11-02T00:13:45.010 に答える