Ich mache einige 3D-Demos mit OpenGL und habe festgestellt, dass GLSL etwas "eingeschränkt" ist (oder bin es nur ich?). Jedenfalls habe ich viele verschiedene Arten von Materialien. Einige Materialien weisen Umgebungsfarben und diffuse Farben auf, andere Materialien weisen eine Umgebungsokklusionskarte auf, andere eine Spiegelkarte und eine Reliefkarte usw.
Ist es besser, alles in einem Vertex / Fragment-Shader-Paar zu unterstützen, oder ist es besser, viele Vertex / Fragment-Shader zu erstellen und sie basierend auf dem aktuell ausgewählten Material auszuwählen? Was ist die übliche Shader-Strategie in OpenGL oder D3D?
Antworten:
Die Antwort ist, es kommt darauf an.
Grundsätzlich gibt es zwei Denkschulen; kleine, optimale Shader für alles und das Uber-Shader-Camp.
Die kleinen Shader sind genau das; Mach eine Sache und mach es gut. Uber-Shader steuern ihre Funktionalität entweder zur Laufzeit über Uniformen oder kompilieren sie mithilfe von Präprozessor-Makros (und / oder generierten Shader-Quellen) zu einer Reihe verschiedener Shader.
Die optimale Lösung ist wahrscheinlich keine, sondern eine Art Hybrid. Vielleicht ein paar Uber-Shader oder Uber-Shader kombiniert mit spezialisierten Shadern für einige Fälle.
Kleiner Shader
Vorteile:
Nachteile:
Uber-Shader
Vorteile:
Nachteile:
quelle
Uber-shader
In dieser Darstellung ist das keine gute Sache :) Ich würde vorschlagen, einen guten Shader-Manager zu schreiben, der auf vordefinierten Werten basiert. Wir werden also einen Uber-Shader-Code mit vielen#ifdef
s haben, der für verschiedene Materialien umgeschaltet wird.