6

立方体にテクスチャを適用する最良の方法 (最小メモリ、最速) はどれですか? しばらくして、私はこの解決策を見つけました:

データ構造:

GLfloat Cube::vertices[] =
 {-0.5f, 0.0f, 0.5f,   0.5f, 0.0f, 0.5f,   0.5f, 1.0f, 0.5f,  -0.5f, 1.0f, 0.5f,
  -0.5f, 1.0f, -0.5f,  0.5f, 1.0f, -0.5f,  0.5f, 0.0f, -0.5f, -0.5f, 0.0f, -0.5f,
  0.5f, 0.0f, 0.5f,   0.5f, 0.0f, -0.5f,  0.5f, 1.0f, -0.5f,  0.5f, 1.0f, 0.5f,
  -0.5f, 0.0f, -0.5f,  -0.5f, 0.0f, 0.5f,  -0.5f, 1.0f, 0.5f, -0.5f, 1.0f, -0.5f
  };

 GLfloat Cube::texcoords[] = { 0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0,
                               0.0,0.0, 1.0,0.0, 1.0,1.0, 0.0,1.0
                             };

 GLubyte Cube::cubeIndices[24] = {0,1,2,3, 4,5,6,7, 3,2,5,4, 7,6,1,0,
                                  8,9,10,11, 12,13,14,15};

描画機能:

        glEnable(GL_TEXTURE_2D);
        glBindTexture(GL_TEXTURE_2D, texture);
        glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
        glColor3f(1.0f, 1.0f, 1.0f);

        glEnableClientState(GL_TEXTURE_COORD_ARRAY);
        glEnableClientState(GL_VERTEX_ARRAY);

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

        glDrawElements(GL_QUADS, 24, GL_UNSIGNED_BYTE, cubeIndices);
        glDisableClientState(GL_VERTEX_ARRAY);
        //glDisableClientState(GL_COLOR_ARRAY);
        glDisable(GL_TEXTURE_2D);

ご覧のとおり、結果は正しいです。 立方体

しかし、この結果を取得するには、いくつかの頂点を再定義する必要があります (vertices配列には 16 の 3D ポイントがあります)。そうしないと、DrawElement 関数でテクスチャをマップできません。

誰かが頂点配列の立方体をテクスチャ化するより良い方法を知っていますか?

4

2 に答える 2

1

しばらく前にopenglesで作業していたときに、同じ問題が発生しました。私の調査によると、各頂点には1つのテクスチャ座標しか関連付けられていないため、これを行う方法は他にありません。

于 2013-01-24T16:47:14.900 に答える
0

そうですね、頂点シェーダーがテクスチャ座標を処理するキューブ マップ テクスチャを使用できます。tex 座標を生成するために必要なのは、頂点シェーダーに次の行を追加することだけです。

out vec2 texcoords;
texcoords=normalize(vertex_data.xy)

頂点を再定義する必要はありません。また、頂点バッファー オブジェクトを使用してパフォーマンスを向上させることもできます。

于 2013-01-24T17:30:40.743 に答える