Twój problem rozwiąże renderowanie z 1-bitową alfą. Co oznacza, że określasz część alfa tekstury źródłowej, która nie jest renderowana (głównie 0,5).
Musisz napisać własny moduł cieniujący, aby oszczędzić głębię światła i skorzystać z instrukcji discard
. Odrzucanie istnieje również w hlsl, glsl i cg. Istnieje tylko w module cieniującym piksele / fragmenty i odrzuca bieżący fragment z renderowania do backBuffer i do bufora Z.
if (texSample.a < 0.5)
discard;
Zaletą jest to, że nie trzeba zmieniać renderowania drugiego przejścia, a jedynie renderowanie głębi światła. Udowodniłem również, że to działa:
Jeśli chcesz renderować prawidłowe cienie dla wielu przezroczystych obiektów, musisz użyć wielu tekstur głębokości, a informacje o głębokości i kryciu są renderowane przy użyciu obierania głębi. I w przypadku dymu, włosów itp. Najlepszym rozwiązaniem są mapy głębokiego krycia lub mapy krycia Fouriera (najbardziej polecam mapy krycia Fouriera)
edycja: Właśnie zdałem sobie sprawę, że zapomniałem dodać kredytów. Jak zawsze. Model drzewa pochodzi z projektu loopix, który jest po prostu świetny, jeśli szukasz trochę niskopolii, jednej tekstury i bezpłatnych modeli roślinności.
Potrzebujesz niestandardowego modułu cieniującego do generowania mapy cieni, abyś mógł wydać prawidłowy okluder, gdy przezroczystość piksela / fragmentu jest większa niż określony próg. W tym przypadku mapa głębokości będzie generowana na piksel, a nie na wielokąt.
źródło
Jedynym sposobem, w jaki mogę to zrobić, jest utworzenie osobnej tekstury mapy głębokości, renderowanie drzew, generowanie głębokości, gdzie alfa! = 0, w przeciwnym razie generowanie głębokości = 1, a następnie łączenie tekstury mapy cieni z teksturą mapy cieni sceny , które powinno być dość proste; po prostu weź najmniejszą z dwóch wartości i ustaw ją na ostateczną mapę głębokości.
To jednak nie rozwiązuje mieszania zamówień; jeśli wyprowadzisz głębokość za teksturą alfa, zostanie ona przesłonięta podczas renderowania kwadratu z teksturą na nim, więc aby ten efekt zadziałał, musisz wyrenderować każdy quad indywidualnie w teksturę mapy głębokości ...
źródło