頂点シェーダーとフラグメント シェーダーが相互作用して、異なるテクスチャを持つ複数のポリゴンを作成する簡単な例を教えてください。
Google for GLSL チュートリアル。例は以前に書かれたものであり、あなたのためだけにもう一度書く理由はありません。または、NVidia OpenGL SDK をダウンロードして調べます。OpenGL.org も書籍を推奨しています。「オレンジブック」はシェーダーをカバーしています。
これは 256x256 に分割されます
伝統的には反対のことをすることが推奨されています - 状態の切り替えを最小限に抑えるために、できる限りすべてのテクスチャを取り、できれば 16384x16384 のような単一の「アトラス」テクスチャに結合します。
私が欲しいのは、複数のテクスチャを持つシェーダーでテクスチャ モデルを描画することですが、モデルはフラットな背景です。大きな(1600x800程度の)画像です
1600x800 は、Riva TNT 2 pro 以降のほぼすべてのハードウェアのテクスチャに完全に収まります。「無駄な」テクスチャ メモリが気になる場合は、多くのカードが 2 の累乗でないテクスチャをサポートしています。ただし、通常、2 の累乗でないテクスチャには制限があり、一部のハードウェア (一部の ati カード + ドライバ) では、このようなテクスチャを使用すると fps が急激に低下します。つまり、200..400 から 40 です。それだけの価値はありません。256MB の VRam を搭載したハードウェアでも、未使用のテクスチャの 40% はマイクロ最適化です。また、VRAM の使用にケチを感じる場合は、テクスチャ アトラスを使用して、「無駄な」スペースを有用なもので埋めることができます。また、ドライバーがビデオ メモリをどれだけ効率的に使用するかは、決してわからないことに注意してください。
CPU でチャンクごとにテクスチャをバインドする必要なく、すべてシェーダーで実行したいのですが、
そんなことはできません。シェーダーはテクスチャをバインドしません。既にバインドされているテクスチャを使用します。
シェーダーは現在コンパイルされていないため、機能するかどうかはわかりませんが、
さて、それらをコンパイルして、もう一度尋ねてください。シェーダーまたはエラー メッセージを表示せずに支援することはできません。シェーダー コンパイラがエラー メッセージを生成することをご存知ですか?
Python で固定関数パイプラインが遅いことに不満を感じた後
C や C++ などのコンパイル済み言語への切り替えを検討してください。バッファやディスプレイ リストを使用せずに、C/C++ アプリケーション (「ダンジョンクローラー」) で生の固定関数openglを使用して、1 秒あたり 200..400 フレームを簡単に取得できます。あなたのテクスチャはミップマップされています。よく知られている「固定機能」アプリケーションには、Quake 1..3、Half-Life 1、Cube など、非常に高速な多くのゲームが含まれます。つまり、遅い場合はあなたのせいです。
C/C++ とは異なり、Python では関数呼び出しのオーバーヘッドが大きくなります。バイトコードを実行し、リスト/タプル (設計により「何でも」を含むことができます) から未知の型の値を抽出し、それを glVertex3f などにフロートとしてダンプし、最終的にネイティブに転送します。 API 呼び出しは、中間ステップのない同様の C/C++ 呼び出しよりも遅くなります。ディスプレイ リストまたはバッファ オブジェクトを使用することでこれを打ち消すことができますが、私にとっては努力する価値はありません。ただし、特定のタスクに特定の言語を使用することは、個人的な好みの問題です。
- 編集 -
ただし、シェーダーがテクスチャをバインドできない場合、マルチテクスチャリングはどのように機能するのでしょうか?
N テクスチャ ステージ (少なくとも 2 - se glGet/GL_MAX_TEXTURE_COORDS/GL_MAX_TEXTURE_UNITS) があり、一度に複数のテクスチャを設定します。glActiveTextureを参照してください。シェーダー (固定機能) を使用しない場合、 glTexEnvを使用して各ステージのカラー操作を指定します。シェーダーでは、複数のテクスチャを設定し、 glUniform1i/glUniform1vを使用してどのサンプラーがどのテクスチャ ステージを使用するかを指定し、Sampler2D および同様の関数を使用してシェーダー内でそれらからデータを読み取ります。シェーダーはテクスチャを切り替えることができません。プログラムによって既に設定されているテクスチャを使用できます。シェーダーは、シェーダー以外のテクスチャについては何も知りません。技術的には、シェーダーはデータの読み取りに使用される「サンプラー」を持っている「テクスチャ」についてさえ知りません。
それともテクスチャサンプリング?シェーダーは、テクスチャの選択/変更でいくつかの作業を実行できる必要があります...
シェーダーは、テクスチャをまったく切り替えたり選択したりしません。この部分は、プログラムによって実行されます。詳細については、使用しているバージョンの opengl/glsl の OpenGL 仕様と GLSL 仕様を参照してください。両方とも、opengl.org Web サイトの「ドキュメント」メニューからダウンロードできます。
すでに述べたように、この時点で GLSL のチュートリアルまたは本が必要です。どちらも見つけやすいです。どちらかを入手して、「理解」するまで読み続けてください。現在、あなたは宿題をして、本やチュートリアルを使って簡単なシェーダーを作ろうとしたようには見えません。本が見つからない場合は、NVidia OpenGL SDK にたくさんの例がありました (C/C++ で書かれていますが、変換するのはそれほど難しくありません)。