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?
performance
shader
Nikitaschwarz
quelle
quelle
Antworten:
Wenn auf moderner Hardware alle Aufrufe in einer Gruppe demselben Pfad folgen, wird der nicht verwendete Pfad nicht ausgewertet.
im Pseudocode:
wird
Wo
anyInvocationARB
ist wahr, wenn ein Aufruf descond
Shaders 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.
quelle