一定の条件はシェーダーの切り替えよりもコストがかかりますか?


14

一般的に、シェーダーでの分岐は良いアイデアではありません。しかし今では、描画呼び出し全体に対して一定の条件を持つシェーダーがあります。したがって、実行されるブランチは、1つの描画呼び出しに対して常に同じです。

そのような種類の分岐は、これらの分岐なしで複数のシェーダーを持ち、それらを切り替えるよりもまだ高価ですか?



私の質問で答えが説明するように、フラグメントは「ワープ」または「ウェーブフロント」にグループ化され、そのようなグループ内のすべてのフラグメントが同じブランチを使用する場合、そのブランチのみが実行されます。
マーティンエンダー

しかし、フラグメントとは異なるシェーダーはどうでしょうか?
-nikitablack


1
これは重複していないと思いますが、それを決定する前に、何が尋ねられているかを明確にするために編集する必要があります。比較する2つのオプションのサンプルコードまたは説明が非常に役立ちます。
-trichoplax

回答:


13

最新のハードウェアでは、グループ内のすべての呼び出しが同じパスに従う場合、未使用のパスは評価されません。

擬似コードで:

if(cond){
   res = ...
}else{
   res = ...
}

になる

if(anyInvocationARB(cond)){
    res1 = ...
}
if(anyInvocationARB(!cond)){
    res2 = ...
}
res = cond?res1:res2;

(opengl拡張機能ARB_shader_group_voteからanyInvocationARBシェーダーの呼び出しがtrueになる場合、trueはどこになります。cond

condがユニフォームのみから派生する場合、ドライバーはレンダリングを開始する前に条件を最適化および評価し、ifを正しいブランチへのgotoに置き換えることができます。OpenGLには、それを明示的にする均一サブルーチンと呼ばれる機能があります。


4
これは事実ですが、パフォーマンスを考慮する必要があるのはそれだけではありません。GPUは依然としてシェーダーごとに静的にリソースをスケジュールするため、両方のブランチを実行しているかのようにリソースを使用する可能性があり、占有率が低下する可能性があります。
ジョンカルスベーク
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.