0

OpenGL について私が完全に理解していないことがあります。私が読んでいることすべてによると、シェーダーをプログラムにアタッチするのに十分な時間シェーダーをコンパイルすることで最高のパフォーマンスが得られます。その後、シェーダー自体を削除して、メモリを解放し、削除されるまでプログラムを追跡します。

私の質問は次のとおりです。上記が当てはまる場合、作成後にシェーダーをアタッチしてプログラムを再リンクできる目的は何ですか? プログラムの着脱や再リンクを行うよりも、2つ目のシェーダープログラムを作成し、シーン作成時に交換した方が効率的ではないでしょうか?

4

1 に答える 1

5

プログラムにシェーダーをアタッチするのに十分な時間だけシェーダーをコンパイルすることで最高のパフォーマンスが得られます。その後、シェーダー自体を削除してメモリを解放し、削除されるまでプログラムを追跡することをお勧めします

このアクティビティは、レンダリングのパフォーマンスには影響しません。ドライバーによるメモリ使用量を減らすのに役立つかもしれませんが、画面上の三角形をより速く表示するのには役立ちません。シェーダーをコンパイルするプロセスは、プログラムをコンパイルした後にモデル化されます。コメントは、完全な実行可能ファイルをコンパイルした後にオブジェクト ファイルを削除することと同じです。

作成後にシェーダーをアタッチしてプログラムを再リンクできる目的は何ですか?

これにより、プログラムに必要なすべてのシェーダーの再コンパイルをスキップし、コンパイルされたシェーダー (リンクされたシェーダー プログラムとは異なります) のみを再リンクして、新しいプログラムを作成できます。実行可能ファイルのビルドと同様に、別のオブジェクト ファイルのセットを使用して新しい実行可能ファイルを作成するようなものです。ソースからすべてを再コンパイルする必要はありません。適切なファイルをリンカーにフィードするだけです。

プログラムの着脱や再リンクを行うよりも、2つ目のシェーダープログラムを作成し、シーン作成時に交換した方が効率的ではないでしょうか?

確かに、それは業界の多くの考えです。パフォーマンスは使用している OpenGL ドライバーの実装に依存しますが、常識的には、状態を更新してシェーダー プログラムのリンクを構成し、リンクを実行してから、パイプラインに新しいシェーダーを "ロード" する方が高速であることが示唆されます。新しいシェーダーを「ロード」します。

于 2013-07-05T17:49:13.447 に答える