WebGL-Fragment-Shader, der bei if-Anweisung nicht richtig verzweigt

9

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?

    
Cookyt 26.11.2013, 14:51
quelle

3 Antworten

0

Vielleicht unterstützt der WebGl-Kontext keine Tiefe. Ausdrücke, die es verwenden, werden dann ignoriert.

Sie können dies mit getContextAttributes ()

überprüfen     
Marcel Blanck 30.11.2013 00:40
quelle
0

Hast 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.

    
Andon M. Coleman 30.11.2013 16:00
quelle
0

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.

    
Arnaud 01.05.2016 20:03
quelle

Tags und Links