プログラム可能なパイプライン(GLSL)が固定パイプラインよりも高速なのはなぜですか?


27

だから私は自分自身にGLSLを教えており、なぜそれが固定機能パイプラインよりも高速であると思われるのかを解明しようとしています。

私が問題を抱えている理由は、私の理解から、あなたが作成するシェーダーは以前に存在したパイプラインのセクションを置き換えているからです。それでは、物事をスピードアップする独自のバージョンを提供するだけではどうでしょうか?

私が考えることができる唯一のことは、以前に独自の照明方程式を提供しようとした場合、CPUで計算を行う必要がありますが、GPUで計算を行うことができ、より高速になります。

これを正しく理解していますか?


既存の関数の独自のバージョンを作成する方が速いのか、それともCPUで計算していた関数をオフロードする方が速いのかを尋ねていますか?
マイケルハウス

gamedev.netで質問に答える投稿を見つけました。
ジョーイグリーン

2
そうですか。他の人が利益を得ることができるように、ここに答えを投稿してください。おそらく、プロセスの中であなたの質問を明確にします。
マイケルハウス

@ joey-greenからgamedev.netにリンクしてください。この質問につまずく人のために私は助けになるでしょう。
クアジイルファン

1
さらに混乱させるために、私のテストでは、少なくとも単純なケースでは、固定パイプラインは実際にはシェーダーよりも高速である可能性があります。参照sol.gfxile.net/instancing.html
ヤリKomppa

回答:


27

作成するシェーダーは、独自の固定機能パイプライン(FFP)のバージョンではなく、クールで複雑な何かを実現するためのカスタムの頂点およびピクセル操作操作です。

プログラマブルパイプライン(PP)を介して行う多くのことは、可能なFFP実装よりも速く動作します。これは、PPがFFPでこれらの仮説的なものをレンダリングするために必要なパス数またはコンバイナーとキューブマップマジックの量を減らすためです。

補間された頂点データとサンプルテクスチャのみを手に持つFFPのピクセルごとの照明などの一般的なものを実装することを想像してください。「誠実に」それを行うことすら不可能であり、忠実に事前計算されたキューブマップといくつかの深刻なブレンドに依存する特別な場合にのみハッキングします。PPでは、光の方向と頂点の法線との間のドット積を色付けする問題になります。

全体として、PPは低速で不可能を高速で可能に変えます。しかし、FFPで使用されているのと同じアルゴリズムを実装するシェーダーを作成することにした場合、FFPはハードウェアに最適化されているため、わずかに高速になることがわかります。


1
いい答え... +1。
アミールザデー

@Greenそれについてはわかりません。どういうわけかポイントを逃します。Kylotanの答えは、実際の質問に対してはるかに適切です。
クリスは、モニカを復活させる

14

理論的には、プログラム可能なパイプラインは固定機能パイプラインよりも低速です。汎用プロセッサは、特殊なケースのプロセッサと競合できません。元の固定機能パイプラインは、理論的に可能な限り高速なライン内の論理ゲートの束にすぎませんでした。

ただし、最近では、プログラム可能なパイプラインが標準となっています。そのため、代わりにハードウェアはプログラム可能なパイプラインに向けられています。特定のデータフロー用に特別に作成された回路を持つという初期の効率を失ったため、シェーダーベースのアプローチである最も一般的なケースに対応する必要があります。ただし、下位互換性オプションの場合、固定機能パイプラインは引き続き使用可能になりますが、コストは古い固定機能をシェーダーに変換する必要があるため、コストが発生する可能性があります。これにより、パフォーマンスの違いが説明されます。


1

私が考えることができる主な理由は、固定パイプラインの段階であり、プログラムがそれを必要としないということです。たとえば、すべてのライトが静的なゲームのイメージを作成する場合、動的なライトの計算を試みないシェーダーを簡単に実装できます。この場合、シェーダーは、ダイナミックライトのいくつかの方程式をチェックするプリコンパイルシェーダー(汎用シェーダー)よりも高速に実行されます。他の例もあります。固定パイプラインで考慮すべき多くの側面を簡単に考えることができますが、独自のGLSLコードでの実装は無視できます。


1

それだけです。シェーダーはパイプラインの一部を置き換えています。ただし、多くの場合、シェーダーは達成したい特定の効果に特化しており、アクティブ化される可能性のあるすべての特殊機能を処理しないため、完全な固定機能パイプラインをエミュレートするシェーダーよりも単純です。固定機能パスでは、使用したくない(または聞いたこともない)多くのこととOpenGL機能を考慮する必要があります。

そして、(完全にプログラム可能なハードウェアとは反対に)特殊なハードウェアで固定機能を実行していた時代は終わりました。固定機能パイプラインを使用すると、おそらく、ドライバーは独自の特別なシェーダーをロードして、固定機能パス。しかし、これらは非常に複雑であり、固定機能パイプラインが提供するすべての機能を提供します。


「おそらく、固定機能パイプラインを使用すると、ドライバーは固定機能パスを実装する独自の特別なシェーダーを読み込むだけです。」..これ本気か?信頼できるリソースを提供していただけますか?ありがとう。
クアジイルファン

@iamcreasy私は信頼できる情報源を持っていないので(おそらくそうだろう)、認めざるを得ない。しかし、今日のグラフィックスカード(多くの小さなプロセッサの集まり)には、照明やフォグの計算専用のハードウェアがまだあることを強く疑います。代わりに、このために事前にコンパイルされたプログラムを特定のシェーダーステージにロードするだけの可能性が高くなります(これらがドライバーまたはROMストレージからのものかどうかはわかりません)。
クリスは、モニカを復活させる

ヌーボーウィキによれば@iamcreasy nouveau.freedesktop.org/wiki/CodeNames、固定されたパイプラインはGeForceの6XXXで除去しました。
ダーティiCE

「おそらく、固定機能パイプラインを使用すると、ドライバーは固定機能パスを実装する独自の特別なシェーダーを読み込むだけです。」本当です。「しかし、これらは非常に複雑で、固定機能パイプラインが提供するすべての機能を提供する可能性があります」優れたドライバーは、有効にした機能だけのシェーダーを生成します。
クリス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.