Frage

Ich bin nicht sicher, ob dies möglich ist, zu tun, aber es ist einen Versuch wert. Ich bin mit dem Puffer Schablone für Lichtmengen in einem latenten Renderer zu reduzieren Überzeichnungs diesen Algorithmus (wenn die Kamera außerhalb des Volumens ist):

  1. einen billigen Shader verwenden, ziehen Rückseiten mit der Tiefe zu LEQUAL Testen Satz, sie in Stencilpuffer Markierung.
  2. die teure Beleuchtung Shader verwenden, Frontflächen mit Tiefentestsatz GEQUAL ziehen.

Dies wird nur Pixel innerhalb des Lichtvolumens verursacht beschattet werden. Das Problem mit dieser kommt, wenn mehrere Lichter Zeichnen. Erstens, da Zustandsänderungen teuer sind, ist es wahrscheinlich nicht die beste Idee, immer wieder zwischen billigen und teuren Shader für jeden Lichtschalter. Ich würde im Idealfall mit dem teueren Shader von 8 Lichtvolumen, gefolgt von Rendering-8 Lichtmengen mit den billigen Shader Vorteile aller 8 Bits des Stencilbuffer nehmen mag. Allerdings ergeben sich Probleme, wenn Lichter überlappen, da es keine Möglichkeit gibt, zu sagen, welche Pixel gehören, an die Lichter.

Die Lösung, die den Sinn kommt, wäre pro Licht 1 Bit in dem Schablonenpuffer zu verwenden. Also, für Licht n , die Markierung n te Bit in Stencilpuffer in dem billigen Pass dann nur Pixel macht mit diesem Bit auf während des teueren Passes ab.

Ich habe Stencilpuffer vor nicht verwendet, sondern von dem, was ich lese dies scheint nicht möglich. Dazu muss ich den Stencil Buffer mit bitweise OR und die Schablone Funktion gesetzt würde arbeiten würde bitweise sein und. Allerdings puffern die einzigen Operationen auf der Schablone kann ich sehen, sind: HALTEN, ZERO, REPLACE, INCR, DECR und INVERT, und die einzigen Funktionen sind: NIEMALS IMMER WENIGER, EQUAL, LEQUAL, GEQUAL, größer und Ungleich.

Gibt es eine Möglichkeit dies irgendwie OR und AND-Verknüpfung Verhalten zu bekommen die Schablonenpuffer? Und wenn nicht, gibt es einen alternativen Ansatz zum effizienten Lichtmengen-Rendering?

War es hilfreich?

Lösung

Um ORing-Updateverhalten, Nutzung glStencilMask kombiniert mit GL_REPLACE zu bekommen. ANDing Testverhalten zu erhalten, verwenden Sie die glStencilFunc mask Parameter mit GL_EQUAL kombiniert. In beiden Fällen werden Sie den ref Parameter glStencilFunc wollen 0xff sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top