Nigdzie nie mogę znaleźć dobrego powodu. Wektor odbicia zastosowany w phong ma prostą podstawę w fizyce. Ale wektor połówkowy zastosowany w blinnie najwyraźniej nie ma racjonalnych podstaw i nie stanowi właściwego odzwierciedlenia. A jednak jest stosowany w każdej tak zwanej „fizycznie” funkcji cieniowania. Jeśli jest to dobra podstawa fizyczna, chciałbym wiedzieć.
To, co udało mi się znaleźć, to kilka powodów:
Jest szybszy - informacje na ten temat są mieszane, ale i tak byłby to świetny powód ... w 1998 roku.
Lepiej radzi sobie z kątami większymi niż 90 stopni - o ile mogę powiedzieć, jedynym powodem jest to, że termin phong został niewłaściwie użyty. Iloczyn iloczynu odbicia i widoku daje kąt od -1 do +1. Zwykle kąt ten jest zaciśnięty od 0 do 1, jest to bezpośrednia przyczyna problemu 90 stopni. Ponownie znormalizuj kąt zamiast go mocować, a uzyskasz pełne pokrycie 180 stopni. Nie wierzę, że prosta operacja x * 0,5 + 0,5 wymyka się światowi grafiki od 40 lat.
lepiej radzi sobie z krawędziami - „problem” krawędzi występuje również w rozwiązaniu Blinna, tylko w mniejszym stopniu. Główną przyczyną jest niewłaściwa symulacja oświetlenia obszaru na terminalu, która powinna być niezbędna dla każdego „fizycznego” modułu cieniującego. Ale nawet w prostszych sytuacjach funkcja sigmoidalna może poprawnie aproksymować miękką linię terminatora. Mnożenie wyrażenia Lambera jest nieprawidłowe, ponieważ niewłaściwie tłumi ono określenie lustrzane, może to spowodować anulowanie wyrażenia Fresnela i prowadzić do dalszych błędów.
Ma długie odbicia na krawędzi - Wydaje mi się, że chociaż odbicia anizotropowe mogą być realistyczne, blinn nie jest właściwym sposobem na ich wdrożenie, ponieważ pojawiają się tylko na brzegu. To tylko szczęśliwy zbieg okoliczności, że błąd w nazwie H wydaje się realistyczny.
Żaden z tych powodów nie jest zadowalający, chcę rozwiązać to szaleństwo.
Chcę wyjaśnić, że nie mówię o Blinn i Phong specjalnie , ale zamiast o składowych wektora H i R, które są wykorzystywane jako podstawa dla tych shaderów, jak również innych.
Właściwie myślę, że sam wymieniłeś powody, dla których Blinn jest domyślny w stosunku do Phong.
Każdy wymieniony przez ciebie powód to obszar, w którym Blinn okazuje się lepszy od Phonga.
Podsumowując, wszystko to prowadzi do tego, że Blinn jest lepszym domyślnym przeciwnikiem niż Phong.
Czy Blinn jest idealny? Czy to jest lepsze niż Phong?
Nie.
Ale jest to rozsądna wartość domyślna. Możesz zamienić Phong na Blinn w dowolnym renderze / shaderze, który napiszesz.
źródło
Odkryłem przyczynę zastosowania wektora H. Niestety nie jest to sposób, w jaki jest stosowany w większości modeli cieniowania, co można następnie uznać za nieprawidłowe.
W przypadku fizycznego zacienienia światło odbite musi być zgodne z równaniami Fresnela. (Większość shaderów „opartych na fizyce” tego nie robi) Mikropacety muszą również przestrzegać równań Fresnela, które zależą od kąta padania światła, a także od współczynnika załamania interfejsu, aby uzyskać poprawny wynik.
Zgodnie z prawem odbicia kąt padania musi być odzwierciedlony z kątem odbicia wzdłuż normalnej powierzchni. Aby promień światła uderzył w kamerę - jak wiemy - musiała zostać odbita od światła - w którym znamy kierunek. Zatem normalna powierzchnia musi przez dedukcję być osią lustra dla tych dwóch kierunków. To daje nam połowę wektora H, który jest pomiędzy nimi. Obliczane przez znormalizowanie sumy obu.
Teraz, obliczając kąt między kierunkiem światła L a wektorem połowy H, uzyskujemy kąt padania dla odbicia zwierciadlanego mikrofaceta i możemy go poprawnie tłumić za pomocą terminu Fresnela.
Zwróć uwagę, że kierunek widoku jest równy R dla tego mikrofacetu, H nie jest określeniem odbicia. Blinn, Cook, Torrance i Sparrow mogą go ssać. Phong i Fresnel mieli rację.
źródło