3

Python で固定関数パイプラインが遅いことに不満を感じた後、ゲームの視差背景を描画するためにシェーダーを調べ始めました。ただし、どの頂点が描画されているかをテクスチャリングする簡単な方法が見つかりません。

私は現在、頂点の配列を持つ PyOpenGL Vertex Buffer Object を持っています。それぞれは次のようになっています: [x, y, z, texX, texY, texID]

これらを getAttribLocation/glEnableVertexAttribArray でシェーダーに渡しています。シェーダーは現在コンパイルされていないため、機能するかどうかはわかりませんが、おそらくひどいテクスチャ コードを追加する前は、色付きの頂点で問題なく機能していました。

私が欲しいのは、複数のテクスチャを持つシェーダーでテクスチャ モデルを描画することですが、モデルはフラットな背景です。これは大きな (1600x800 程度の) 画像で、256x256 のテクスチャとクワッド ポリゴンに分割されています。(副次的な質問: ポリゴンのビットがオフスクリーンになるように、より小さなポリゴンを使用する方が良いですか、それとも、テクスチャ バインディングが少なくなるように大きなポリゴンを使用する方がよいでしょうか?)

複数の関連するテクスチャなので、CPU 上のチャンクごとにテクスチャをバインドする必要はなく、すべてシェーダーで処理したいので、頂点データと一緒にテクスチャ データを送信するのが最適だと考えたのですが、うまくいきません。仕事。

頂点シェーダーとフラグメント シェーダーが相互作用して、異なるテクスチャを持つ複数のポリゴンを作成する簡単な例を教えてください。

編集: シェーダー、vbo などはこちら: http://pastebin.com/3LaYiyvhシェーダーはコンパイルされるようになりましたが、三角形は見えません。

EDITEDIT:そこに着きました!最終的に何がクラックしたのかはわかりませんが、プログラムは次のとおり です。確信はないけど。また、描画中にテクスチャを交換するため、大きな背景を小さなチャンクに分割して描画することはお勧めできません。無駄なスペースのある大きなテクスチャは問題ありませんが、アトラスの方が優れています!

4

3 に答える 3

2

Python で固定関数パイプラインが遅いことに不満を感じた後、ゲームの視差背景を描画するためにシェーダーを調べ始めました。

固定機能が遅い場合、シェーダーを使用しても高速にはなりません。

おそらく、即時モードを使用している、またはハードウェアアクセラレーションがまったくないなど、根本的に間違ったことをしているだけです (適切にインストールされたドライバーがないためなど)。

于 2012-03-03T01:31:04.743 に答える
1

おそらく、私のMinecraft マッピング ブログの投稿で役立つ情報を見つけることができるでしょう。すべての例では、Python、Pygame、および PyOpenGL を使用しています。彼らはフラグメント シェーダーで多くのことを行います。単純なジオメトリのみを使用します: 1 つのクワッドのみです。

あなたの説明から、複数の小さなテクスチャよりも 1 つの大きなテクスチャの方がはるかに優れているように思えます。ただし、多くの小さなテクスチャを用意し、シェーダーでそれらの中から選択することが本当に理にかなっているシナリオがあります。配列テクスチャ は、テクスチャ アトラスを使用するときに発生する可能性があるフィルタリングとクランプに関する同じ問題に悩まされないため、この状況で役立ちます。(実際、私のブログの例ではテクスチャ アトラスを使用しており、ズームアウトするとミップ マッピングの問題が発生します。最近、この問題を解決するために配列テクスチャを使用しています。)

于 2012-03-03T14:59:34.840 に答える
1

頂点シェーダーとフラグメント シェーダーが相互作用して、異なるテクスチャを持つ複数のポリゴンを作成する簡単な例を教えてください。

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++ で書かれていますが、変換するのはそれほど難しくありません)。

于 2012-03-03T06:25:01.577 に答える