Shadow Mapping und transparente Quads


10

Bei der Schattenzuordnung wird anhand des Tiefenpuffers berechnet, wo Schatten gezeichnet werden sollen.

Mein Problem ist, dass ich möchte, dass einige halbtransparente strukturierte Quads Schatten werfen - zum Beispiel Bäume mit Plakaten. Da der Tiefenwert für das gesamte Quad und nicht nur für die sichtbaren Teile festgelegt wird, wird ein Quad-Schatten geworfen, was ich nicht möchte.

Wie kann ich meine transparenten Quads mithilfe der Schattenzuordnung dazu bringen, korrekte Schatten zu werfen?

Antworten:


15

Ihr Problem wird das Rendern mit 1-Bit-Alpha lösen. Dies bedeutet, dass Sie ein Alpha der Quelltextur angeben, das nicht gerendert wird (meistens 0,5).

Sie müssen Ihren eigenen Shader schreiben, um die Tiefe vor Licht zu schützen und Anweisungen zu verwenden discard. Discard gibt es auch in hlsl, glsl und in cg. Es existiert nur im Pixel / Fragment-Shader und verwirft aktuelle Fragmente aus dem Rendering in backBuffer und in z-buffer.

if (texSample.a < 0.5)
   discard;

Der Vorteil ist, dass Sie Ihr Rendering im 2. Durchgang nicht ändern müssen, sondern nur das Rendering der Lichttiefe. Auch ich habe bewiesen, dass es funktioniert: 1 Bit Alpha

Wenn Sie korrekte Schatten für mehrere transparente Objekte rendern möchten, müssen Sie Texturen mit mehreren Tiefen verwenden, wobei Tiefen- und Deckkraftinformationen mithilfe von Tiefenschälen gerendert werden. Und für Rauch, Haare usw. Tiefenopazität oder Fourier-Opazitätskarten sind die beste Lösung (ich empfehle meistens Fourier-Opazitätskarten)

edit: Mir ist gerade klar geworden, dass ich vergessen habe, Credits hinzuzufügen. Wie immer. Das Baummodell stammt aus dem Loopix-Projekt, was einfach großartig ist, wenn Sie nach LowPoly, einer Textur und freien Vegetationsmodellen suchen.


6

Mit programmierbarer Pipeline sollten Sie es so machen, wie es @notabene angewiesen hat. Es ist jedoch auch einfach, mit einer festen Pipeline zu arbeiten, ohne Shader zu schreiben. In OpenGL ist glAlphaFunc genau das, was Sie wollen. Zum Beispiel:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
Ordentlich. Ich hasse feste Pipelines. Also bewundere ich wirklich jeden, der diese Dinge ohne Shader machen kann. +1 sicher.
Notabene

@Notabene Es ist absolut nichts Bewundernswertes an der Verwendung veralteter Technologie.
Tara

2

Sie benötigen einen benutzerdefinierten Shader für die Schattenkartengenerierung, damit Sie einen gültigen Okkluder ausgeben können, wenn die Transparenz des Pixels / Fragments größer als der von Ihnen angegebene Schwellenwert ist. Auf diese Weise wird die Tiefenkarte pro Pixel und nicht pro Polygon generiert.


-1

Die einzige Möglichkeit, die ich mir vorstellen kann, besteht darin, eine separate Tiefenkartentextur zu erstellen, die Bäume darin zu rendern, die Tiefe mit alpha! = 0 auszugeben, andernfalls die Tiefe = 1 auszugeben und diese Schattenkartentextur mit der Szenenschattenkartentextur zu kombinieren , was einfach genug sein sollte; Nehmen Sie einfach den kleinsten der beiden Werte und setzen Sie diesen auf die endgültige Tiefenkarte.

Dies löst jedoch keine Mischaufträge. Wenn Sie eine Tiefe hinter einer Alpha-Textur ausgeben, wird diese beim Rendern des Quad mit der Textur überschrieben. Damit dieser Effekt funktioniert, müssen Sie jedes Quad einzeln in die Tiefenkarten-Textur rendern ...

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.