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:
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.
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.
quelle
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 ...
quelle