GLSL, alles in einem oder mehreren Shader-Programmen?

17

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?

stjepano
quelle
2
siehe stackoverflow.com/questions/4649801/…
Patryk Czachurski
Dies ist eine falsche Zweiteilung, bei der Sie den einen oder anderen Ansatz zum Verwalten von Shadern wählen müssen. In fünfzehn Jahren in der Branche habe ich noch nie an einem Projekt gearbeitet, bei dem wir uns an eines der beiden Extreme gehalten haben, aber immer ein Gleichgewicht zwischen den beiden Ansätzen zum Verwalten von Shadern hergestellt haben, wobei jeder Ansatz sinnvoll war.
Trevor Powell

Antworten:

12

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:

  • Wahrscheinlich schneller / optimaler
  • Tut genau das, was Sie wollen
  • Kann leicht seltsame, benutzerdefinierte Sachen machen

Nachteile:

  • Kommt schnell außer Kontrolle, besonders wenn die Anzahl der Features zunimmt
  • Wahrscheinlich mehr Arbeit, es sei denn, Sie haben eine sehr kleine Anzahl von Shadern

Uber-Shader

Vorteile:

  • Alles an einem Ort
  • Künstlerfreundlicher (für die erstmalige Verwendung von Feature A mit Feature X ist keine Coder-Zeit erforderlich)

Nachteile:

  • Längere Shader-Kompilierzeiten
  • Weniger optimale Ergebnisse (insbesondere wenn Uniformen zum Ein- und Ausschalten von Funktionen verwendet werden)
  • Ist möglicherweise schwieriger zu debuggen / optimieren
Jari Komppa
quelle
Uber-shaderIn 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 #ifdefs haben, der für verschiedene Materialien umgeschaltet wird.
Brigadir
2
Ich füge hinzu, dass ein weiterer Vorteil eines Uber-Shaders darin besteht, dass das Wechseln von Shadern Kosten in Bezug auf die Leistung verursacht. Wenn Sie also weniger häufig wechseln, können Sie möglicherweise die Leistung verbessern.
Jherico