2

テクスチャを配列テクスチャに組み合わせてコードを最適化しようとしています (ほとんどのテクスチャが繰り返されるため (地上など)、テクスチャ アトラスを使用できないことに気付きました)。私は PyGame と PyOpenGL で作業していますが、これまでシェーダーを使用したことがありません。単一の配列テクスチャをバインドし、glBindTexture(GL_TEXTURE_2D_ARRAY, texname)3D テクスチャ座標などを使用してさまざまなレイヤーにアクセスすることは可能ですか? シェーダーなしでも可能ですか?

現時点では、この関数を使用してすべてのテクスチャに対して glDrawArrays を呼び出しています。

def DRAW(im, array):
    glBindTexture(GL_TEXTURE_2D,im)
    glTexCoordPointer(2, GL_FLOAT, 32, array)
    glNormalPointer(GL_FLOAT, 32, array[2:])
    glVertexPointer(3, GL_FLOAT, 32, array[5:])
    glDrawArrays(GL_QUADS,0,len(array)/8)
4

2 に答える 2

4

テクスチャ配列は、シェーダーなしでは使用できません。それらは固定機能パイプラインの一部ではありませんでした。GL にはイネーブル ビットはありませんGL_TEXTURE_2D_ARRAY

固定関数フラグメント処理は、OpenGL 4.5 互換性プロファイル仕様のセクション 16 で指定されています。. セクション 16.2 には次のように記載されています。

配列テクスチャとマルチサンプル テクスチャは、シェーダーでのみサポートされており、固定機能のテクスチャリングでは有効にできない場合があります。

元のGL_EXT_texture_array拡張機能には、次のステートメントがあります。

(2) 固定関数フラグメント処理でテクスチャ配列をサポートする必要がありますか?

解決済み: いいえ。努力する価値があるとは考えられていません。TEXTURE_1D_ARRAY_EXT固定機能フラグメント処理は、アプリケーションが有効または無効にできるようにすることで簡単にサポートできますTEXTURE_2D_ARRAY_EXT

固定関数フラグメント処理の場合、シャドウ マッピングを使用した 2 次元配列テクスチャのテクスチャ ルックアップに問題があることに注意してください。すべてのテクスチャ ルックアップが射影的であることを考えると、合計 5 つの座標コンポーネント (s、t、レイヤー、深さ、q) が必要になります。

(3) 固定関数がサポートされている場合、レイヤー番号 (T または R) は射影テクスチャ ルックアップで Q で割るべきですか?

解決済み: この拡張機能で解決する必要はありませんが、問題になる可能性があります。おそらく、アプリケーションが除算を必要とする場合があります (多かれ少なかれ S/T のように R を処理します)。分割が望ましくない場合は、おそらく他にもあるでしょう。多くの開発者は気にしませんし、Q 座標が何に使われるかさえ知らないかもしれません! デフォルトの 1.0 では、射影ルックアップを気にしないアプリケーションは、単純にその事実を無視できます。

プログラム可能なフラグメント シェーディングの場合、アプリケーションはどちらの方法でもコーディングでき、非射影ルックアップを使用できます。射影ルックアップの Q による除算が OpenGL ハードウェアで「無料」または「安価」である限り、コンパイラは計算された座標の射影パターンを認識し、コードを適切に生成できる場合があります。

配列テクスチャが OpenGL コア機能に昇格したとき、これは変更されませんでした。

于 2015-06-27T16:00:21.617 に答える