5

レンダリング機能を動作させようとしています。頂点配列を使用しています。これが私の頂点構造です。

struct Vertex 
{
    float x, y, z;              // The x, y and z floating point values     
    float u, v;                 // The u - v texture coordinates
    float padding[3];   // needs to be multiple of 32
};

これが私のレンダリングコードです:

// Render the mesh
void WLD::render(GLuint* textures, long curRegion, CFrustum cfrustum)
{

    int num = 0;

    // Set up my indices
    GLuint indicies[3];

    // Cycle through the PVS
    while(num < regions[curRegion].visibility.size())
    {
        int i = regions[curRegion].visibility[num];

        if(!regions[i].dead && regions[i].meshptr != NULL)
        {
            if(cfrustum.BoxInFrustum(regions[i].meshptr->min[0], regions[i].meshptr->min[2], regions[i].meshptr->min[1], regions[i].meshptr->max[0], regions[i].meshptr->max[2], regions[i].meshptr->max[1]))
            {
                // Cycle through every polygon in the mesh and render it
                for(int j = 0; j < regions[i].meshptr->polygonCount; j++)
                {   
                    // Assign the index for the polygon to the index in the huge vertex array
                    indicies[0] = regions[i].meshptr->poly[j].vertIndex[0];
                    indicies[1] = regions[i].meshptr->poly[j].vertIndex[1];
                    indicies[2] = regions[i].meshptr->poly[j].vertIndex[2];

                    glEnableClientState(GL_VERTEX_ARRAY);
                    glVertexPointer(3, GL_FLOAT, sizeof(Vertex), &verticies[0].x);

                    // Texture index
                    int tex = regions[i].meshptr->poly[j].tex;
                    // Need to bind this to the polygon I render.

                    glEnableClientState(GL_TEXTURE_COORD_ARRAY);
                    glTexCoordPointer(2, GL_FLOAT, sizeof(Vertex), &verticies[0].u);
                    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indicies);

                    glDisableClientState(GL_VERTEX_ARRAY);
                    glDisableClientState(GL_TEXTURE_COORD_ARRAY);
                }
            }
        }
    num++;
    }
}

引数の1つである、GLuint *テクスチャには、ロードされたすべてのテクスチャが含まれています。したがって、line int tex = region [i] .meshptr-> poly[j].tex;によって返される値。この特定のポリゴンのテクスチャのインデックスです。レンダリングするときに、それを各ポリゴンにバインドするにはどうすればよいですか?ご不明な点がございましたら、お気軽にお問い合わせください。

glClientActiveTexture()を使用する必要があることはわかっていますが、1つは未定義であり、正しいヘッダーが見つからないことを示しています。2つは、どのように使用されているかわかりません。良い例は見つかりませんでした。では、ポリゴンがテクスチャインデックス4を参照しているとしたら、glClientActiveTextureでレンダリングするときに、ポリゴンにバインドするにはどうすればよいですか。

4

2 に答える 2

3

あなたがやろうとしていることは、一般的には不可能です。glDraw*通常、複数のテクスチャを使用して単一の三角形のストリーム (呼び出し)をレンダリングしようとはしません。いずれにせよ、あなたが意図する方法ではありません。

1 つの描画呼び出し内の各三角形は、その描画呼び出し内の他のすべての三角形と同じテクスチャ セットから取得する必要があります。

一般的な解決策は、画像を 1 つのテクスチャに結合することです。これは一般に「テクスチャ アトラス」と呼ばれます。この場合、頂点のテクスチャ座標は、テクスチャ アトラス (単一のテクスチャ) のどこから画像データを取得するかを記述します。

GL 4.0 対応のハードウェア (D3D11) と GLSL を使用している場合は、任意の計算に基づいて 16 のテクスチャから動的に選択できるトリックがあります。また、以前のハードウェアでは、シェーダーを使用してテクスチャを選択できました。ただし、どちらの場合も、データを適切に処理するよりも遅くなります。

于 2011-08-08T02:26:27.347 に答える
1

あなたはあなたの正しいアプローチでこれを行うことができます。必要ありませんglClientActiveTexture。この関数はマルチテクスチャ用であり、すべてのポリゴンに適用されるテクスチャは1つだけだと思います。したがって、必要なテクスチャをを使用してバインドするだけで、ポリゴンを描画する前に(シェーダーを使用しない場合は)glBindTexture(GL_TEXTURE_2D, textures[tex])忘れないでください。glEnable(GL_TEXTURE_2D)

しかし、それは機能しますが、これは明らかにそれを行うための最良の方法ではありません。頂点配列は、一度に複数のプリミティブ(三角形)をレンダリングするためにあり(1回の呼び出しglDrawElements)、それらを使用して単一の三角形をレンダリングすることはできません。最初の最も簡単なアイデアは、少なくともポリゴンをテクスチャインデックスで並べ替えてから、への1回の呼び出しですべての三角形を同じテクスチャでレンダリングすることglDrawElementsです。より高度なアプローチについては、ニコルの答えを見てください。

于 2011-08-08T13:42:06.590 に答える