1

立方体を作成し、その座標を変更して、このような梁にしました(クリックしてください)

プロジェクトに他のテクスチャを正常にロードしたので(SOILを使用して)、テクスチャが正常にロードされていると確信しています。

ビームのコードは次のとおりです。

glBindTexture(GL_TEXTURE_2D, obstacle_texture);
glBegin(GL_QUAD_STRIP);
    // front
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
    glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);
    // back
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);
    // right
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
    // left
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(0.0f, height, -side);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, 0.0f);
    // top
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, height, 0.0f);
    glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, height, -side);
    // bottom
    glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, 0.0f);
    glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
    glTexCoord2f(0.0f, 1.0f);   glVertex3f(0.0f, 0.0f, -side);
glEnd(); 

結果は次のとおりです。

beam_wrongTextureMapping

テクスチャマッピングに問題があるか、立方体
をそのままにしてテクスチャを適用してからスケーリングする必要があります(ただし、これによりテクスチャが歪んで見えるようになると思います)。

私は何をすべきか?

更新#1: SOILの前は、サイトで見つけたBMPファイル用のローダーを使用していました。私は今それを使用しました、そしてそれはこのように見えます:

ここに画像の説明を入力してください

私が指摘したように、立方体には三角形の全体があるように見えることに注意してください。私はこのようにSOILを使用しています:

GLuint tex_2d = SOIL_load_OGL_texture
        (
        imagepath,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | SOIL_FLAG_INVERT_Y | SOIL_FLAG_NTSC_SAFE_RGB | SOIL_FLAG_COMPRESS_TO_DXT
        );
    glBindTexture(GL_TEXTURE_2D, tex_2d);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT );
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT );
4

1 に答える 1

4

したがって、ここで少なくとも 3 つの問題があります。

クワッドストリップをレンダリングしていますが、個別のクワッドをレンダリングしているかのように座標を指定しています。したがって、追加のプリミティブがレンダリングされます。これは問題の原因ではありませんが、どこかで悪いジオメトリを吐き出しています。

一部の UV 座標はずれているように見えます。ある面では座標が面の周りを進んでいますが、他の面では座標がジグザグになっています。

最初の 2 つの顔は次のとおりです。

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, 0.0f);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, 0.0f, 0.0f);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(side, height, 0.0f);
glTexCoord2f(0.0f, 1.0f );  glVertex3f(0.0f, height, 0.0f);

glTexCoord2f(0.0f, 0.0f);   glVertex3f(0.0f, 0.0f, -side);
glTexCoord2f(0.0f, 1.0f);   glVertex3f(side, 0.0f, -side);
glTexCoord2f(1.0f, 0.0f);   glVertex3f(side, height, -side);
glTexCoord2f(1.0f, 1.0f);   glVertex3f(0.0f, height, -side);

2 番目の面では、中​​央の 2 つの UV 座標が対角線上にありますが、最初の面では反対です。これらのうちの 1 つしか正しくないため、正しくない面ではテクスチャリングが悪くなります。

テクスチャの読み込みの問題はパディングの問題である可能性が高く、読み込まれるテクスチャには GL が期待するものとは異なるパディング要件があります (GL はデフォルトで、テクスチャ データの行が 4 バイトにパディングされることを期待しています)。テクスチャのパディング方法を GL に伝えるか、一致するようにテクスチャを変更します (これが、BMP テクスチャがより適切に機能する理由です。BMP のパディング要件は偶然にも GL で機能します)。

これに対する可能な修正は次のとおりです。

  • (たとえば)を使用して、テクスチャがどのようにパックされているかをGLに伝えますglPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  • パディングが何も変更せずに一致するように、テクスチャの寸法を変更します
  • パディングがGLが期待するものと一致するように、テクスチャの読み込みを変更します

BMP テクスチャと PNG テクスチャの両方に奇妙な黄色のストライプが表示されているため、ここでさらに問題がある可能性があると思われますが、最初に明らかな問題を修正します。

最後に、標準的なアドバイス - 個々の頂点を送信する古いスタイルの固定関数パイプラインを避け、VBO と描画呼び出しを使用します。

于 2013-02-19T11:19:23.613 に答える