Zitat von
blackfin:
Ist es wirklich die einzige und beste Möglichkeit, für jegliche vorkommende Variante [...] eine eigene Shader-Variante zu kompilieren und dann einzusetzen?
Das ist, soweit ich das überblicke, der übliche Weg. Vor allem ohne Techniques wirst du da nicht wirklich drum rum kommen fürchte ich. Das sinnigste dürfte eine Kollektion von Teil-Shadern und spezialisierten Versionen sein, die man "on demand" zusammen schraubt und durch den Compiler nudelt. Nicht traumhaft schön, aber so ist das ja noch an einigen Stellen in der Shader-Welt: Komfort kommt später. Vielleicht.
(Bin ja schon froh Hochsprachen dafür zu haben - und ziemlich fähige Compiler dazu!) Und, wie du ja gemerkt hast, Branching = nono, vor allem dynamisches.*
Ich erinnere mich z.B. an Battlefield 2. Da wurde nach Änderung der Grafikeinstellungen immer reichlich lange mit Ladebalken gewerkelt, mit dem Label "Shader werden optimiert". Ich vermute da hinter genau oben genanntes, es ist also denke ich eher kein bad-practice. Im gamedev Forum gab es dazu auch schon mal irgendwo einen Thread, in dem der Tenor ähnlich war, wenn ich mich nicht böse irre.
Wenn man es wirklich geschickt anstellt, kann man Shader ja in Code-Fetzen zerlegen, die in verschiedensten Kombinationen zusammen gesetzt laufen können. Dann könnte man sich zur Runtime im Speicher seinen dynamischen Shader zusammen würfeln, ohne vorab zig einzelne, für jeden möglichen Fall separate anlegen zu müssen.
*) Ich hab auf gamedev hier und da aufgeschnappt, dass man in einigen Fällen mit Lerp() Branching-ähnliches Verhalten bekommen kann, und dies etwas flotter wäre. Frag mich aber grad nicht nach Details! Das könnte Pipeline-schonender sein, wenn ich mal mutig Mutmaßen soll. Was man aber nicht wirklich verhindern können wird ist, dass immer alle Branches auch ausgeführt werden - zumindest so lange nicht jedes Pixel seine eigene ALU+Caches hat
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)