Was ist bei Verwendung von GLSL auf modernen (GL3.3 +) GPUs die Wahrscheinlichkeit, dass Verzweigungen auf einer Uniform auftreten?
In meiner Engine komme ich zu dem Punkt, an dem ich viele Shader habe. Und ich habe verschiedene Qualitätsvoreinstellungen für viele davon. So wie es aussieht, verwende ich Uniformen mit if () in den Shadern, um verschiedene Qualitäts-Presets auszuwählen. Ich bin jedoch besorgt, dass ich eine bessere Leistung erreichen könnte, indem ich die Shader neu kompiliere und #ifdef benutze. Das Problem dabei ist, dass ich mir Sorgen machen muss, andere Uniformen zu verfolgen und zurückzusetzen, wenn ich einen Shader neu kompiliere.
Grundsätzlich möchte ich wissen, ob meine Befürchtungen unbegründet sind. Ist die Verzweigung auf eine einheitliche billige auf modernen GPUs? Ich habe selbst ein paar Tests gemacht und fand nur wenig Unterschied, aber ich habe nur auf einem nVidia 680 getestet.
Ich gebe zu, dass ich kein Experte bin, aber vielleicht ist meine Spekulation besser als nichts.
Ich würde denken, dass die Verzweigung auf Uniformen in der Tat ziemlich billig ist. Es unterscheidet sich deutlich von der Verzweigung in Textur- oder Attributdaten, da alle ALUs in der SIMD dem gleichen Codepfad vom Shader folgen, also eher ein "echter" Zweig als eine Ausführungsmaske. Ich bin mir nicht sicher, wie Shader-Prozessoren unter Verzweigungsblasen in ihrer Pipeline leiden, aber die Pipeline wird sicherlich flacher sein als bei Allzweck-CPUs (besonders angesichts der viel niedrigeren Taktraten, mit denen sie typischerweise arbeiten). p>
Ich wünschte, ich könnte hilfreicher sein und ich würde es auch schätzen, wenn jemand anderes autoritativer antworten kann. Ich für meinen Teil würde mir allerdings nicht allzu viele Gedanken darüber machen, ob man sich auf Uniformen verzweigen könnte. Aber wie immer, wenn Sie die Möglichkeit haben, profilieren Sie Ihren Shader und sehen Sie, ob es einen spürbaren Unterschied macht.