0

3D モデルのテクスチャを取得するのに問題があります。テスト目的で基本的なプリミティブを使用しており、より多くのエンジン固有のコードに取り組んでいるため、3D モデルに飛び込んでいます。ただし、glDrawElements 関数に問題があります。テクスチャをクワッドに描画できるため、テクスチャが正しく読み込まれていることがわかっています (コメントの glBegin に注意してください)。ただし、glDrawElements を使用すると、テクスチャが描画されません。テクスチャの一部の色 (黄色) が表示されます。テクスチャリング コードを削除すると、3D モデルが最後に設定された色に戻るため、何かを行っています。おそらく glVertexAttributePointer と関係があるのではないかと考えています。これらの関数が何をしているのかがわかります。

glMatrixMode(GL_MODELVIEW);
    glMultMatrixf(m_Props.WorldMatrix.data);

    glEnableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glEnableVertexAttribArray(2);

    glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), 0);
    glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)12);
    glVertexAttribPointer(2, 3, GL_FLOAT, GL_FALSE, sizeof(VertexPTN), (const GLvoid*)20);

    glBindBuffer(GL_ARRAY_BUFFER, pExtra->GetVB());
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, pExtra->GetIB());

    glScalef(0.05, 0.05, 0.05);

    glEnable(GL_TEXTURE_2D);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, pTexExtra->GetTexture());

     glDrawElements(GL_TRIANGLES, pExtra->GetIndexCount(), GL_UNSIGNED_INT, 0); 
     /*glBegin(GL_QUADS);
        glTexCoord2f(0, 0); glVertex3f(0.0f, 0.0f, 0.0f);
        glTexCoord2f(0, 1); glVertex3f(10.0f, 0.0f, 0.0f);
        glTexCoord2f(1, 1); glVertex3f(10.0f, 10.0f, 0.0f);
        glTexCoord2f(1, 0); glVertex3f(0.0f, 10.0f, 0.0f);
     glEnd();*/

    glDisable(GL_TEXTURE_2D);


    glDisableVertexAttribArray(2);
    glDisableVertexAttribArray(1);
    glDisableVertexAttribArray(0);

私の VertexPTN クラスは、Position、Texture Coordinate、Normal の単なるコンテナです。したがって、クラス内のベクトルの配置が進むと想定しています。Vector3f、Vector2f、Vector3f、glVertexAttributePointer の最後のパラメーターを 0、12、20 に設定します。

私が見逃しているものについて誤解はありますか?私は実際には openGL のプロではありませんが、セットアップと基本的なレンダリングについてはある程度理解しています。未設定の GL 状態で、テクスチャがメッシュにレンダリングされない原因は何ですか?

4

1 に答える 1

0

いくつかの考え:

シェーダーを使用していますか?glVertexAttribPointer はシェーダーでのみ機能します

  • はいの場合: 入力が 0、1、および 2 であることは確かですか? シェーダーが glBindAttribLocation とリンクする前にこれらを設定しない場合、特定の値であるとは限りません。
  • No の場合: AttribPointer の代わりに glVertexPointer、glTexCoordPointer などを使用する必要があります。

また、シェーダーを使用している場合、GL_TEXTURE_2D の有効化/無効化は冗長であり、何もしません。

于 2012-05-15T01:16:23.350 に答える