Ich arbeite an einem WebGL-Programm, das Shadow-Mapping implementiert. Nach Berechnung der Tiefenwerte an jedem Fragment habe ich am Ende eine if-Anweisung, die die Beleuchtung basierend darauf berechnet, ob das Fragment in einem Schatten ist oder nicht.
%Vor%
Dabei ist depth
die Tiefe der Schattenkarte und light_tex_coord
die Position des Fragments im Szenenraum von light1
. light1
ist ein Punktlicht, das sich um das Modell dreht, und light0
ist ein Punktlicht, das statisch an der Kamera positioniert ist.
Das Problem hier ist, dass der if-Zweig nie genommen wird, so dass die Szene nur light0
hat. Ich habe überprüft, dass depth
, light_tex_coord
und calculateLighting
korrekt funktionieren.
Hier ist das Seltsame, das obige mit dem folgenden Code ersetzt:
%Vor%
Bewirkt, dass schattierte Bereiche korrekt in rot gezeichnet und nicht schattiert in grün gezeichnet werden. Das heißt, die Verzweigung wird korrekt ausgewertet. Ersetzen Sie es mit diesem:
%Vor%
Bewirkt, dass die Beleuchtung korrekt berechnet wird (ohne Schatten). Es scheint, dass wenn ich die teurere calcLighting-Funktion in der if-Anweisung aufruft, es nicht einmal die Mühe macht, es zu nehmen.
Außerdem habe ich versucht, die Beleuchtung auf verschiedene Arten anzuwenden, einschließlich der Funktion clamp
; mache immer die Addition und benutze einen terinären Operator, um den zweiten calcLighting
-Aufruf mit 1 oder 0 zu multiplizieren und meine if-Anweisung auf verschiedene Arten zu arrangieren. Nichts scheint zu funktionieren.
Gibt es etwas, das mir daran fehlt, wie die Verzweigung in Webgl funktioniert?
Vielleicht unterstützt der WebGl-Kontext keine Tiefe. Ausdrücke, die es verwenden, werden dann ignoriert.
Sie können dies mit getContextAttributes ()
überprüfenHast du anstelle der Verzweigung etwas wirklich Radikales betrachtet:
%Vor% Es ist nicht die schönste Lösung der Welt, aber es könnte Ihnen eher etwas bringen, was Sie suchen. Es nimmt im Grunde Ihren light_tex_coord.z - depth <= 0.0
bedingten Ausdruck und macht es zu einem schönen Gleitkomma 0.0 oder 1.0 , dass Sie die Beleuchtung mit entweder keep oder verwirft das Verzweigungsergebnis. Art der Art und Weise Shader verwendet zu arbeiten, bevor die dynamische Ablaufsteuerung eingeführt wurde.
Das Thema ist 2 Jahre alt, aber hier sind meine 2 Cent:
Ich hatte ein ähnliches Problem und fand eine Seite im Internet mit einer Diskussion, die den folgenden Satz enthielt:
[...] (es sei denn, Sie machen verrückte Sachen wie das Bild schreibt innerhalb der Bedingung Blöcke). [...]
Also habe ich versucht, die Pixelfarbe in eine temporäre Variable zu setzen
%Vor%local zu main (), in den "if" -Anweisungen modifiziere ich nur col und setze die Pixelfarbe nur ganz am Ende:
%Vor%Das hat mein Problem gelöst. Natürlich kann es lästiges zusätzliches Programmieren erfordern, damit der Fluss in jeder Situation die letzte Zeile erreicht.