1

私は OpenGL ES 1.0 で遊び始めましたが、いくつかの (初心者) 問題に遭遇しました: 三角形で表される立方体に正方形のテクスチャをマップしようとしました。

    // Turn necessary features on
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glBlendFunc(GL_ONE, GL_SRC_COLOR);
    glEnable(GL_CULL_FACE);
    //glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);  

    // Bind the number of textures we need, in this case one.
    glGenTextures(1, &texture[0]);
    glBindTexture(GL_TEXTURE_2D, texture[0]);
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

//Drawing code
static GLfloat rot = 0.0;

static const Vertex3D vertices[] = {
    -1.0f,-1.0f,-1.0f, //0  00  
     1.0f,-1.0f,-1.0f, //1  10
     1.0f, 1.0f,-1.0f, //2  11
    -1.0f, 1.0f,-1.0f, //3  01      
};


static const int vertexCnt = 3 * 2;

static const GLubyte cube[] = {
    3,0,2,
    1,2,0,
};

static const GLfloat texCoords[] = {
    0,1,
    0,0,
    1,1,
    1,0,
    1,1,
    0,0,
};


glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

glLoadIdentity();

glTranslatef(0.0f, 0.0f, -3.0f);

glBindTexture(GL_TEXTURE_2D, texture[0]);

glEnableClientState(GL_VERTEX_ARRAY);
//glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_COLOR_MATERIAL);


glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);

//glColorPointer(4, GL_FLOAT, 0, colors);
glNormalPointer(GL_FLOAT, 0, normals);



glDrawElements(GL_TRIANGLES, vertexCnt, GL_UNSIGNED_BYTE, cube);


glDisableClientState(GL_VERTEX_ARRAY);
//glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_NORMAL_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);

今、無数の試みの後、私はそれを他の面でうまく機能させることができません...正方形のテクスチャを三角形にマッピングするときの経験則はありますか?

編集:マッピングをどのように行うべきかを理解していると思います。しかし、この例 (1 つの顔) では機能しません。マッピングが正しく行われたかどうかを誰かが確認できますか (残りのコードが機能していると仮定して)。

どうもありがとう

4

2 に答える 2

1

私はあなたの頂点リストを調べようとはしませんでしたが座標が完全にめちゃくちゃでマッピングが間違っているか、インデックス バッファ形式を正しく指定していないか、バック フェース カリングがオンになっていて、いくつかの頂点の順序が間違っています。

テクスチャ座標自体に関しては、四角形と比較して三角形へのマッピングにトリックはないはずです。6 つの頂点 (面ごとに 2 つの複製) があるため、以前は 4 つだったテクスチャ座標が 6 つだけ必要になります。キューブの場合と同様に、インデックス バッファーを使用して重複を回避できる場合があります。

潜在的な背面カリングの問題については、毎回同じ順序で頂点を定義する必要があります。テクスチャが向く方向に対してすべて時計回り、またはすべて反時計回りです。

OpenGL パイプラインを設定するために使用しているコマンドと、それらの頂点を描画するために使用しているコマンドは何ですか? 対応するコードを質問に追加してください。

于 2010-11-29T21:49:34.170 に答える
1

他の人たちと同じように、クワッド テクスチャを三角形にマッピングするトリックはないと思います。

発生している主な問題は、各コーナーのテクスチャ座標が不連続であるためです。1 つの面の UV 座標 {u,v} として 1 つの角がある場合、頂点を共有する他の 2 つの面で同じ値を持つことを意味しません。立方体の各コーナー (3 つの面で共有) で UV が一意になるように、また 4 つの UV 値 ({0,0}、{1,0}、{1,1} および{0,1}) が各面に存在しますが、一部のテクスチャは完全に歪んでしまいます。これを紙で確認してみてください: {1,1} は常に {0,0} の反対側にあるとは限りません。

開始する最も簡単な方法は、それぞれが 2 つの三角形で構成される 6 つのクワッドを明示的に宣言することです。これにより、合計 24 個の頂点 (24 個の位置と 24 個のテックス座標、インターリーブされているかどうかに関係なく) と 36 個のインデックス (2 つの三角形で構成される 6 つのクワッド、 6 * 2 * 3 = 36 ) が得られます。

立方体を表示するように更新されたコードを次に示します (曲がりくねった問題がある可能性があるため、面のカリングを無効にしました)。

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glDisable(GL_CULL_FACE);

static const float vertices[] = {
        0.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 0.0f,

        0.0f, 1.0f, 1.0f,
        0.0f, 0.0f, 1.0f,
        1.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 1.0f,

        0.0f, 1.0f, 1.0f,
        1.0f, 1.0f, 1.0f,
        0.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 0.0f,

        0.0f, 0.0f, 1.0f,
        0.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 1.0f,
        1.0f, 0.0f, 0.0f,

        1.0f, 1.0f, 0.0f,
        1.0f, 1.0f, 1.0f,
        1.0f, 0.0f, 0.0f,
        1.0f, 0.0f, 1.0f,

        0.0f, 1.0f, 0.0f,
        0.0f, 0.0f, 0.0f,
        0.0f, 1.0f, 1.0f,
        0.0f, 0.0f, 1.0f
        };


static const int vertexCnt = 6 * 4;

static const GLubyte cube[] = {
     0,  1,  2,  1,  2,  3,
     4,  5,  6,  5,  6,  7,
     8,  9, 10,  9, 10, 11,
    12, 13, 14, 13, 14, 15,
    16, 17, 18, 17, 18, 19,
    20, 21, 22, 21, 22, 23 
};

static const GLfloat texCoords[] = {
    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,
    0.0f, 1.0f,

    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    0.0f, 1.0f,
    0.0f, 0.0f,
    1.0f, 1.0f,
    1.0f, 0.0f,

    0.0f, 0.0f,
    1.0f, 0.0f,
    0.0f, 1.0f,
    1.0f, 1.0f,

    1.0f, 0.0f,
    1.0f, 1.0f,
    0.0f, 0.0f,
    0.0f, 1.0f
    };

glClearColor(0.0, 0.0, 0.0, 1.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

//glLoadIdentity();

//glTranslatef(0.0f, 0.0f, -3.0f);
glRotatef(3.1415927f, 1.0f, 1.0f, 0.0f);

glBindTexture(GL_TEXTURE_2D, spriteTexture);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);

glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
glVertexPointer(3, GL_FLOAT, 0, vertices);

glDrawElements(GL_TRIANGLES, 36, GL_UNSIGNED_BYTE, cube);
于 2010-12-06T23:42:20.653 に答える