In Direct3D sind Multipass-Shader einfach zu verwenden, da Sie Übergänge innerhalb eines Programms buchstäblich definieren können. In OpenGL scheint dies etwas komplexer zu sein, da Sie einem Shader-Programm beliebig viele Vertex-, Geometrie- und Fragment-Shader zuweisen können.
Ein beliebtes Beispiel für einen Multipass-Shader ist ein Toon-Shader. Ein Durchgang bewirkt den eigentlichen Cel-Shading-Effekt und der andere erzeugt den Umriss. Wenn ich zwei Vertex-Shader "cel.vert" und "outline.vert" sowie zwei Fragment-Shader "cel.frag" und "outline.frag" habe (ähnlich wie in HLSL), wie kann ich das tun? kombinieren, um den vollständigen Toon-Shader zu erstellen?
Ich möchte nicht, dass du sagst, dass ein Geometrie-Shader dafür verwendet werden kann, weil ich nur die Theorie hinter Multipass-GLSL-Shadern kennen will;)
Antworten:
Es gibt keine "Theorie" hinter Multipass. Es gibt keine "Multipass-Shader". Multipass ist sehr einfach: Sie zeichnen das Objekt mit einem Programm. Dann zeichnen Sie das Objekt mit einem anderen Programm.
Sie können D3DX-Dateien wie FX-Dateien verwenden, um diese zusätzlichen Pässe zu verbergen. Aber sie arbeiten immer noch so. OpenGL hat einfach kein Versteck dafür.
quelle
Rendern Sie das Objekt mit dem Zellenshader und rendern Sie es dann mit dem Gliederungsshader erneut.
quelle
In OpenGL 4.0 gibt es einheitliche Unterprogramme . Damit können Sie Funktionen definieren, die zur Laufzeit mit sehr geringem Aufwand ausgelagert werden können. Sie können also für jeden Durchgang eine Funktion ausführen. Außerdem 1 Funktion für jeden Shader-Typ.
Hier gibt es ein Tutorial .
Für ältere OpenGL-Versionen ist es am besten, mehrere verschiedene Shader zu haben und zwischen ihnen zu wechseln. Andernfalls können Sie Werte addieren, die Sie mit einer Uniform multiplizieren, die entweder 0.0 oder 1.0 ist, um sie ein- oder auszuschalten. Andernfalls ist es bedingt, wenn Anweisungen verwendet werden können, OpenGL jedoch bei jeder Ausführung / jedem Durchgang alle möglichen Ergebnisse ausführt. Stellen Sie also sicher, dass sie nicht zu schwer sind.
quelle
Es gibt einige Leute, die viel über GLSL wissen, also hoffe ich, dass sie den Rekord klarstellen, aber basierend auf dem, was ich gesehen habe, sollten Sie in Ihrem Fragment-Shader in der Lage sein, so etwas zu tun (Pseudocode, I) Überlassen Sie den tatsächlichen GLSL den Leuten, die ihn besser kennen.
Wenn Sie
if
s auf diese Weise verwenden, erhalten Sie so etwas wie mehrere Durchgänge. Ist das sinnvoll?Edit: Hoffentlich hilft diese Frage zu SO auch dabei , Missverständnisse auszuräumen.
quelle