W OpenGL (i innych systemach) współczynnik tłumienia odległości dla lamp punktowych jest podobny 1/(c+kd+sd^2)
, gdzie d
jest odległość od światła i c
, k
i s
są stałymi.
Rozumiem sd^2
element, który modeluje dobrze znane fizycznie dokładne tłumienie „odwrotnego prawa kwadratowego” oczekiwane w rzeczywistości.
Wydaje mi się, że stała c
, zwykle jedna, jest w stanie poradzić sobie z bardzo małymi wartościami d
(i być może obronę dzielenia przez zero?).
Jaką rolę ma kd
komponent liniowy w modelu (domyślnie k
w OpenGL wynosi zero). Kiedy użyjesz innych wartości k
? Wiem, że nazywa się to składnikiem „liniowego tłumienia”, ale jakie zachowanie symuluje w modelu oświetlenia? Wydaje się, że nie pojawia się w żadnym fizycznym modelu światła, którego jestem świadomy.
[EDYTOWAĆ]
David Gouveia zwrócił uwagę, że można zastosować współczynnik liniowy, aby pomóc scenie „spojrzeć” bliżej tego, co zamierzał twórca / artysta, lub by lepiej kontrolować tempo opadania światła. W którym przypadku moje pytanie brzmi: „czy liniowy współczynnik tłumienia ma fizyczny odpowiednik, czy jest po prostu używany jako współczynnik kruszenia, który pomaga kontrolować jakość światła na scenie?”
Odpowiedzi:
Światło ze źródeł punktowych pada wraz z kwadratem odległości. To jest rzeczywistość fizyczna.
Często tłumi się liniowe tłumienie. Ale dotyczy to tylko pracy w nieliniowej przestrzeni kolorów. To znaczy, jeśli nie masz aktywnej właściwej korekcji gamma. Powód jest dość prosty.
Jeśli zapisujesz liniowe wartości RGB na nieliniowym wyświetlaczu bez korekcji gamma, wówczas twoje wartości liniowe zostaną zniekształcone przez wbudowaną rampę gamma monitora. To skutecznie przyciemnia scenę w porównaniu z tym, co rzeczywiście zamierzałeś.
Zakładając, że gamma wynosi 2,2, monitor skutecznie podniesie wszystkie kolory do potęgi 2,2 podczas ich wyświetlania.
To tłumienie liniowe:
1/kd
. To tłumienie liniowy gamma rampy monitora zastosowano:1/(kd)^2.2
. To dość blisko właściwej relacji odwrotnej do kwadratu.Ale rzeczywista odwrotność kwadratu:
1/sd^2
postać:1/((s^2)(d^4.4))
. To powoduje, że tłumienie światła spada znacznie bardziej niż oczekiwano.Ogólnie rzecz biorąc, jeśli używasz właściwej korekcji gamma (np. Renderowania do bufora ramki sRGB), nie powinieneś używać tłumienia liniowego. To nie będzie wyglądać dobrze. W ogóle . A jeśli nie używasz korekcji gamma ... co jest z tobą nie tak;)
W każdym razie, jeśli próbujesz naśladować rzeczywistość, potrzebujesz odwrotnego kwadratu (i korekcji gamma). Jeśli tak nie jest, możesz zrobić wszystko, co trzeba dla swojej sceny.
źródło
Elastyczność .
Ponieważ możesz chcieć, aby twoje światła spadały liniowo. Zapewnia ci to kontrolę. Tak naprawdę nie musi być fizycznie dokładny (a całe równania oświetlenia cieniowania phong też z pewnością nie są fizycznie dokładne).
Czasami model kwadratowy zbyt szybko wydziela światło w pobliżu źródła i pozostawia „białe spojrzenia” na pobliskich powierzchniach. Zapewniając współczynniki liniowe i stałe, masz swobodę dostosowania wyników do własnych upodobań
Na przykład, kiedy wdrożyłem raytracer, dowiedziałem się, że odwrotne prawo kwadratu spowodowało, że światła punktowe zbyt szybko spadały. Zmieniłem na zaciśnięty model liniowy (w którym każde światło miało minimalny i maksymalny promień, z interpolacją liniową pomiędzy nimi) i po prostu wyglądało lepiej.
Edycja: Właśnie znalazłem fajny zasób wyjaśniający to .
źródło
Okej, zgadnę.
Wstępna obserwacja
Krzywa dla
c+kd+sd^2
jest parabolą, podobnie jak krzywa dlasd^2
; różnica nie jest tak ważna, jak mogłoby się wydawać: zachowują się podobnie w nieskończoności, tylko dla małych wartości różnią się. Cokolwiekk
to znaczy, ma sens tylko wtedy, gdy znajduje się blisko światła.Wstępne uproszczenie
Ponieważ jest to współczynnik tłumienia , który równie dobrze możesz ustawić
s == 1
, lub podzielić każdą stałąs
w wyrażeniu i podzielić moc źródła światłas
. W formule jest o jeden parametr za dużo.Kończysz z:
Zmiana zmiennych
… Co jest ściśle równoważne z:
z
A == c/s - k^2/(4s^2)
i, co ważniejsze,D == d + k/2s
.To
1/(A+D^2)
naprawdę wygląda jak zwykle1/(c+d^2)
, prawda?Wniosek
Przez
k
czynnik przyspiesza lub spowalnia światło tłumienie tak, że uruchamia się tylko w promieniu-k/2s
(tak, to może również mieć „negatywny” promień, pomyśl wyimaginowanego punktu świetlnego wewnątrz wyimaginowanej zwierciadła sferycznego, które pozwalają tylko światło się po raz drugi) . Wygląda na to, że matematyka znów wygrywa!Edytować: Przez chwilę myślałem, że to odpowiednik sferycznego światła, ale tak nie jest. Co najważniejsze, nie będzie generować miękkich cieni.
Przydatność?
Domyślam się, że ten parametr może być użyty przez artystę, aby światło wyglądało tak, jakby było bliżej (lub dalej) od obiektu pod względem iluminacji, ale bez przesuwania go. Ponieważ światła punktowe generują ostre cienie, może być wymagane, aby światło pozostawało w określonej pozycji.
źródło
Współczynnik liniowego tłumienia jest fizycznym odpowiednikiem światła docierającego do ośrodka. Bez tłumienia światło wydaje się przemieszczać w idealnej pustce. Podczas renderowania scen „realistycznych”, chcesz, aby powietrze tłumiło intensywność światła na odległość, a to tłumienie jest liniowe.
źródło
1/d
wR
współrzędnych i jeszcze przez1/d^2
wtheta
aphi
sferycznych współrzędnych. Opisujesz zatem1/d^3
tłumienie natężenia światła.Współczynnik liniowego tłumienia występuje w przypadkach, w których możesz chcieć zastosować liniowe tłumienie do swojego oświetlenia, ale najważniejsze jest to, że nie musisz go używać (ani żadnego z innych czynników tłumienia, jeśli o to chodzi).
Pozwala to dostroić oświetlenie do własnych upodobań. Więc po prostu ustaw dowolny współczynnik tłumienia, którego nie chcesz na 0, i te, które chcesz, aby nie były równe 0 i gotowe.
Jednym konkretnym przykładem, w którym można zastosować tłumienie liniowe, byłoby zastosowanie bardziej matematycznie odwrotnego kwadratu zapewniającego zbyt szybki spadek. Za pomocą liniowej można uzyskać wynik, który może wyglądać mniej więcej dobrze (i przy mniejszej ilości świateł na scenie); więc użyłbyś 0 stałej, 1 liniowej i 0 wykładniczej.
Warto zauważyć (ale co prawda nie ma znaczenia w tej dyskusji), że duszki punktowe zarówno w OpenGL, jak i D3D (i parametry punktowe w OpenGL) używają tej samej formuły tłumienia.
Warto również zauważyć, że oświetlenie OpenGL / D3D nie jest ściśle przeznaczone do fizycznej poprawności; nigdy nie został zaprojektowany jako coś więcej niż akceptowalne przybliżenie i należy o tym pamiętać, pytając o cokolwiek związanego ze sposobem jego działania.
Oczywiście w dzisiejszych czasach najprawdopodobniej będziesz używać modułu cieniującego, więc stara lekka formuła ma głównie znaczenie akademickie / historyczne - możesz napisać dowolną lekką formułę.
źródło
c
to stała wartość tłumienia dla źródła światła.l
to tłumienie liniowe. Dlatego jest mnożony przez dystant do źródła światła.s
jest kwadratowym tłumieniem, więc jest mnożone przez kwadrat odległości.Ten link zawiera więcej informacji .
źródło
Może to wynikać z faktu, że Z, według słów cenionego Erica Lengyela ,
Bufor głębokości przechowuje odległości. Światło wykorzystuje odległość do tłumienia. Konieczna może być zależność między buforem głębokości a implementacjami oświetlenia, choć miałoby to zastosowanie tylko wtedy, gdy algorytm oświetlenia działałby w przestrzeni ekranu, jak sądzę. Pamiętaj, że lepiej zawsze przechowywać odwrotne obliczenia (lub obliczone sprzętowo) odwrotnie, niż wykonywać podział na niepodzieloną wartość dla każdej operacji na klatkę, która jej potrzebuje ... i która zwykle jest bardzo dużą liczbą operacji.
To tylko przypuszczenie.
źródło
Podobnie jak dodatek: Kiedy używasz modelu openGL do przybliżenia sferycznego źródła światła, wszystkie trzy współczynniki mają sens i są ważne (nie „aby zapobiec przelewom” lub mieć „artystyczną swobodę”):
Dla kuli o promieniu r otrzymujemy:
1 / (d / r + 1) ^ 2
to przekłada się na
c = 1 k = 2 / r s = (1 / r ^ 2)
(patrz http://imdoingitwrong.wordpress.com/2011/01/31/light-attenuation/ ).
Imho to przybliżenie jest lepsze niż używanie nieskończenie małych lamp punktowych bez żadnego przedłużenia!
źródło
Mam inne zdanie na temat formuły.
Na przykład, gdy patrzymy na światło punktowe, faktycznie widzimy rozpraszanie światła. Zatem wzór 1 / d ^ 2 dotyczy tylko emitowania światła tego piksela. Ale jasność tego piksela w naszym aparacie będzie miała bardziej skomplikowaną formułę, która wykorzysta teorię rozpraszania światła. Zobacz artykuł
„Próbkowanie epipolarne dla cieni i promieni Crepuscular w uczestniczących mediach z pojedynczym rozproszeniem”
autor: Thomas Engelhardt, Carsten Dachsbacher Ale niestety nie mają ostatecznej prostej formuły rozpraszania światła. Chyba ostateczny efekt naśladowania GPU byłby podobny do formuły liniowej i kwadratowej.
Myślę więc, że roszczenie:
„jeśli próbujesz naśladować rzeczywistość, chcesz uzyskać odwrotność do kwadratu (i korekcji gamma)” nie jest poprawny.
Właściwie używam formuły z czynnikami liniowymi i kwadratowymi bez gamma, które mogą bardzo dobrze naśladować efekty świecące. Liniowy nie może.
W krótkim podsumowaniu formuła ma fizyczny odpowiednik rozpraszania światła.
źródło