2

パフォーマンスの観点から、ブランチの両側に1つずつ、合計2つのシェーダーを作成するか、ピクセルシェーダーコード内にブランチを配置する方がよいでしょうか。たとえば、水平パスと垂直パスのどちらを実行するかを決定するガウスぼかしシェーダーがある場合は、2つの別々のシェーダーに分割して、一方をバインドしてからもう一方をバインドするか、ブランチをシェーダー内に保持する方がよいでしょう。コード自体、つまり、2番目のパスでシェーダーを切り替える必要はありませんか?

void main(void)
{
    ...

    if (uniform_Orientation == 0)
    {
        // Horizontal blur
    }
    else
    {
        // Vertical blur
    }
}

私の本能は、それを2つの別々のシェーダーに分割する必要があると言っていますが、シェーダーを切り替えることによるパフォーマンスへの影響がわかりません。

誰かこれについて何か考えがありますか?

4

1 に答える 1

2

シェーダーには 2 種類のブランチがあります。

  • 静的分岐: たとえば、均一変数に基づく条件で if を使用する場合。ブランチは、シェーダーが開始される前に評価できます。
  • 動的分岐: シェーダー内の変数に基づきます。たとえば、可変変数に基づく条件です。ピクセルは異なるパスを使用できるため、これにはコストがかかります。

あなたの問題は静的分岐に陥ります。もちろん、静的分岐は動的分岐よりもはるかに優れており、高速です。

質問に対する答え: 静的分岐がシェーダーの実際の切り替えよりも速いかどうかは明らかではありません。それはもちろん依存します。しかし、あなたの例では、おそらくパフォーマンスの違いは見られません。

シェーダーの切り替えを最小限に抑えるためだけに多くの静的分岐を持つ「uber シェーダー」の詳細を参照してください。http://wiki.gametheorylabs.com/groups/judgementengine/wiki/4c55c/Uber_Shader.html

于 2013-02-03T17:13:36.277 に答える