Mapowanie cieni i przezroczyste quady

10

Mapowanie cieni wykorzystuje bufor głębokości do obliczenia, gdzie należy narysować cienie.

Mój problem polega na tym, że chciałbym, aby niektóre półprzezroczyste teksturowane quady rzucały cienie - na przykład drzewa billboardowe. Ponieważ wartość głębokości zostanie ustawiona na całym kwadracie, a nie tylko na widocznych częściach, rzuca kwadratowy cień, czego nie chcę.

Jak sprawić, by moje przezroczyste quady rzucały prawidłowe cienie za pomocą mapowania cienia?

CiscoIPPhone
źródło

Odpowiedzi:

15

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: 1 bit alfa

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.

Notabene
źródło
6

Z programowalnym potokiem powinieneś to zrobić zgodnie z instrukcją @notabene. Łatwo jest to jednak zrobić także w przypadku stałego potoku bez pisania programów cieniujących. W OpenGL glAlphaFunc jest tym, czego chcesz. Na przykład:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);
sprzedać
źródło
1
Schludny. Nienawidzę stałego rurociągu. Naprawdę podziwiam wszystkich, którzy potrafią to robić bez shaderów. +1 na pewno.
Notabene
@Notabene Nie ma absolutnie nic godnego podziwu w stosowaniu przestarzałej technologii.
Tara
2

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.

r2d2rigo
źródło
-1

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

meds
źródło