Czy element tłumienia liniowego w modelach oświetleniowych ma fizyczny odpowiednik?

18

W OpenGL (i innych systemach) współczynnik tłumienia odległości dla lamp punktowych jest podobny 1/(c+kd+sd^2), gdzie djest odległość od światła i c, ki ssą stałymi.

Rozumiem sd^2element, 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 kdkomponent liniowy w modelu (domyślnie kw 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?”

Rozpoznać
źródło
Nie powiedziałem, że tłumienie liniowe sprawia, że scena wygląda lepiej lub bardziej realistycznie. Powiedziałem, że może wyglądać lepiej dla twoich celów. Mój raytracer oświetlił bardzo małą scenę, a przy porównaniu obu modeli liniowy wyglądał lepiej. Nie potrzebuję fizycznego powodu, aby powiedzieć, że wyglądał lepiej - po prostu wyglądał bliżej efektu, który chciałem osiągnąć. I odwrotnie, nie jest tak, że odwrotne prawo kwadratowe nie wyglądało realistycznie, po prostu odpadło zbyt szybko i mniej przyczyniło się do oświetlenia sceny niż to, czego potrzebowałem.
David Gouveia,
Przepraszam, David, nie chciałem fałszywie przedstawiać twojej odpowiedzi. Zmieniłem powyższą edycję.
Ken
1
Zawsze warto pamiętać, że całe oświetlenie to hack, czyste i proste =)
Patrick Hughes

Odpowiedzi:

21

Ś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^2postać: 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.

Nicol Bolas
źródło
4
+1 Przez jakiś czas wiedziałem o renderowaniu poprawnym gamma. Od pewnego czasu wiem o tłumieniu kwadratowym i liniowym. I w tym momencie po raz pierwszy uzmysławiam sobie związek między nimi. :-)
David Gouveia,
Czy jest jakiś powód dla -1?
Nicol Bolas,
9

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 .

David Gouveia
źródło
6

Okej, zgadnę.

Wstępna obserwacja

W OpenGL (i innych systemach) współczynnik tłumienia odległości dla lamp punktowych jest podobny 1/(c+kd+sd^2), gdzie djest odległość od światła i c, ki ssą stałymi.

Rozumiem sd^2element, który modeluje dobrze znane fizycznie dokładne tłumienie „odwrotnego prawa kwadratowego” oczekiwane w rzeczywistości.

Krzywa dla c+kd+sd^2jest parabolą, podobnie jak krzywa dla sd^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ę. Cokolwiek kto 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łą sw wyrażeniu i podzielić moc źródła światła s. W formule jest o jeden parametr za dużo.

Kończysz z:

1/(c/s+(k/s)d+d^2)

Zmiana zmiennych

… Co jest ściśle równoważne z:

1/(A + D^2)

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

sam hocevar
źródło
3

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.

Ravachol
źródło
Nie sądzę, że to może być prawda. Światła emitowanego przez medium będzie tłumiony 1/dw Rwspółrzędnych i jeszcze przez 1/d^2w thetaa phisferycznych współrzędnych. Opisujesz zatem 1/d^3tłumienie natężenia światła.
sam hocevar,
3

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

Maximus Minimus
źródło
1
  • c to stała wartość tłumienia dla źródła światła.
  • lto 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 .

r2d2rigo
źródło
Dzięki, ale moje pytanie dotyczy roli liniowego elementu tłumiącego w modelowaniu światła. Pytam, ponieważ nie pojawia się w żadnym znanym mi fizycznym modelu światła. Podany link NIE wyjaśnia, do czego służy element tłumienia liniowego. Po prostu mówi; „jest to tłumienie liniowe”, bez innych wyjaśnień.
Ken
Ok, źle zinterpretowałem twoje pytanie. Tłumienie liniowe byłoby lepiej obserwowane w nieskończonym, jednowymiarowym źródle światła (pomyśl o świetlówce), podczas gdy kwadratowe modeluje zachowanie sferycznego źródła światła. Do tej pory znalazłem tylko jedno miejsce, w którym wyjaśniono związek między fizycznym modelem światła a tym stosowanym w grafice komputerowej: imdoingitwrong.wordpress.com/2011/01/31/light-attenuation
r2d2rigo
1

Może to wynikać z faktu, że Z, według słów cenionego Erica Lengyela ,

jest nieliniowy, ponieważ rasteryzacja z poprawną perspektywą wymaga interpolacji liniowej 1 / z - interpolacja liniowa samego z nie daje poprawnych wyników. Sprzęt musi obliczyć 1 / z na każdym wierzchołku i interpolować go w trójkącie, więc wygodnie jest po prostu zapisać tę wartość w buforze głębokości zamiast wykonywać drogiego podziału na każdym pikselu w celu odzyskania z.

Fakt, że zbliżasz się do dokładności bliżej zbliżonej płaszczyzny, to tylko efekt uboczny i nie ma nic wspólnego z motywacją stojącą za interpolacją 1 / z.

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.

Inżynier
źródło
Możesz być na czymś tam. Może to mieć coś wspólnego z przestrzenią, w której obliczane jest oświetlenie. Ale nie sądzę, że bufor głębokości jest jego częścią, ponieważ przechowuje „pseudo-odległość” od oka (lub płaszczyzny przedniej) do obiektu, a nie odległość od światła do obiektu. Jest to odległość światła stosowana w oświetleniu.
Ken
@downvoter - chcesz komentować, czy po prostu trolling? (cytując Jonathana)
Inżynier
Również przy głosowaniu tłumienie obliczane jest w przestrzeni oka, a nie w przestrzeni znormalizowanej -> perspektywa / z nie ma z tym nic wspólnego
Oliver Zendel
1

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!

Oliver Zendel
źródło
Jak powstaje wzór 1 / (d / r + 1) ^ 2? Oryginalny artykuł mówi tylko: „Po przyjrzeniu się wynikom serii testów stało się oczywiste”, co nie jest wystarczająco przekonujące pod względem pytania, dotyczy modelowania fizycznego.
user1914692,
0

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.

użytkownik1914692
źródło