17

さて、これらのテクスチャは本当に私を混乱させます. このチュートリアル (素晴らしいと思います)、特に「最大 32 個のテクスチャ ユニットを定義できますが、シェーダーごとに最大 8 個のテクスチャしか定義できません。」というキャプションが付けられた画像を見てきました。私が理解しているように、これがどのように機能するかです:

テクスチャ ユニットをアクティブにします。次に、テクスチャ オブジェクト (画像の「テクスチャ データ」キューブに類似) をそのユニット内の特定のターゲットにバインドします。そのため、glGenTextures でオブジェクトを作成して名前を取得し、glBindTexture でそのテクスチャを TEXTURE_2D などにバインドします (現時点では他のターゲットには興味がありません)。その後、glTexImage2D でテクスチャ データを指定できます。

今。それぞれ異なるテクスチャが必要な 3 つのシェーダー プログラムを使用しています。これが私がやりたいことです:

初期化段階では、各テクスチャ ユニットを調べて、

  • glActiveTexture
  • glBindTexture (アクティブなテクスチャ ユニットで動作)
  • glTexImage2D (現在バインドされているオブジェクトで動作)

シェーダーの場合、I glUniform を使用して、各シェーダーのユニフォームを glActiveTexture の GL_TEXTUREi で指定された「i」値に一致させます。必要なテクスチャは全部で 4 つだけで、かなり小さいものです。

これで、レンダリング中にプログラムを正常に切り替えることができ、すべてが機能するはずですよね? 各プログラムには、使用するユニットを指定するユニフォームが既にあり、各ユニットには既に TEXTURE_2D ターゲットにバインドされたオブジェクトがあり、各オブジェクトには glTexImage2D で指定されたデータがありますよね? 私のレンダー関数ではユニットのバインディングやアクティブ化は必要ありませんか? 少なくとも私はそのように理解していましたが、間違ったテクスチャが間違った場所に描かれています。

さらに、プログラムの 1 つで、1 つのサーフェスに対して 3 つのテクスチャを切り替えたいと考えています。そこで、各テクスチャをオブジェクトにロードし、各オブジェクトをユニットにバインドすると、レンダリング時に glUniform を使用して、使用するテクスチャ ユニットをプログラムに伝えることができると考えました。

だから、OpenGL のテクスチャリングの基本的な構造を誤解したのか、それともプログラムが切り替えられるとオブジェクトのユニットへのバインドが期限切れになるのか、そのようなものなのか疑問に思っています。または、テクスチャを複数回バインドする必要がありますか?しかし、いつ、なぜですか?

4

1 に答える 1

11

各テクスチャ オブジェクトに glTexParameteri を設定することを忘れないでください。

void loadTextures() {
    GLint texture_object_handles[3];
    glGenTextures(3, texture_object_handles);

    for (int i = 0 ; i < 3 ; ++i) {
        glActiveTexture(GL_TEXTURE0 + i);
        glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, ...);
    }
    return;
}


void draw() {
    // Draw three different materials without rebinding any textures.
    for (i = 0 ; i < 3 : ++i) {
        ... specify other uniforms and attributes
        glUniform1i(texture_location, i);
        ... 
        glDrawElements(...);
    }
    return;
}    
于 2012-11-20T22:48:03.900 に答える