Ist eine konstante Bedingung teurer als das Wechseln von Shadern?

14

Im Allgemeinen ist das Verzweigen in Shader keine gute Idee. Aber jetzt habe ich einen Shader mit einer Bedingung, die in Bezug auf den gesamten Draw-Aufruf konstant ist. Die ausgeführte Verzweigung ist also für einen Draw-Aufruf immer dieselbe.

Ist eine solche Verzweigung immer noch teurer als die Verwendung mehrerer Shader ohne diese Verzweigungen und der Wechsel zwischen ihnen?

Nikitaschwarz
quelle
Wie die Antwort auf meine Frage erklärt, werden die Fragmente in "Verzerrungen" oder "Wellenfronten" gruppiert, und wenn alle Fragmente in einer solchen Gruppe denselben Zweig verwenden, wird nur dieser Zweig ausgeführt.
Martin Ender
Aber was ist mit Shadern, die sich von Fragmenten unterscheiden?
Nikitablack
1
Ich vermute, dass dies kein Duplikat ist, aber es muss bearbeitet werden, um zu verdeutlichen, was gefragt wird, bevor das bestimmt werden kann. Ein Beispielcode oder eine Erklärung der beiden verglichenen Optionen würde viel helfen.
Trichoplax

Antworten:

13

Wenn auf moderner Hardware alle Aufrufe in einer Gruppe demselben Pfad folgen, wird der nicht verwendete Pfad nicht ausgewertet.

im Pseudocode:

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

wird

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

Wo anyInvocationARBist wahr, wenn ein Aufruf des condShaders wahr ist als (von der opengl-Erweiterung ARB_shader_group_vote ).

Wenn cond allein aus Uniformen abgeleitet werden kann, kann der Fahrer den Zustand optimieren und auswerten, bevor er mit dem Rendern beginnt, und das if durch ein goto zum richtigen Zweig ersetzen. OpenGL verfügt über eine Funktion namens Uniform Subroutines, die es explizit macht.

Ratschenfreak
quelle
4
Dies ist wahr, aber es ist nicht das einzige, was Sie für die Leistung berücksichtigen müssen. GPUs planen weiterhin statisch Ressourcen pro Shader, sodass diese Ressourcen möglicherweise weiterhin so sind, als würden Sie beide Zweige ausführen, was sich negativ auf die Belegung auswirken kann.
John Calsbeek