Podstawą fizyczną kolorów plamy oleju jest opalizowanie , a także związane z pierścieniami Newtona . W szczególności grubość warstwy olejowej jest rzędu długości fali światła. Ponieważ światło odbija się zarówno od górnej, jak i dolnej powierzchni oleju, na dowolnej długości fali, pod niektórymi kątami oba odbicia będą poza fazą i wzajemnie się znoszą; pod innymi kątami odbicia będą w fazie i będą się sumować. Dzieje się tak pod różnymi kątami dla każdej długości fali, więc rozświetlenie oleju białym światłem daje wszystkie te kolory. Jeśli podświetlisz go jedną częstotliwością (np. Światło lasera), zobaczysz tylko serię jasnych i ciemnych pierścieni.
Jeśli zignorujesz załamanie w warstwie olejowej, po prostu opracowując geometrię sytuacji, możesz stwierdzić, że jasność odbitego światła dla dowolnej długości fali powinna się różnić jak
sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5
Teoretycznie powinno to być zintegrowane na wszystkich długościach fal, ale w praktyce prawdopodobnie można to po prostu zrobić dla czerwieni, zieleni i niebieskiego - powiedzmy odpowiednio 700, 550 i 400 nm. Zmiana grubości oleju zmieni promień pozorny pierścieni koloru. Prawdopodobnie owinąłbym 2.0 * pi * oilThickness / wavelength
pojedynczą wartość RGB dostarczoną do modułu cieniującego jako jednolitą wartość. W razie potrzeby można go pomnożyć przez teksturę, aby zasymulować zmienną grubość oleju - prawdopodobnie to daje większość interesującej tekstury na powyższym obrazku.
Daje to wartość koloru RGB, którą można pomnożyć do formatu BRDF. dot(L, H)
Czynnikiem będą wykorzystywane do punktowych / kierunkowe światła, można zastąpić dot(N, V)
tam stosowania tego jak dobrze do refleksji środowisko mapy.
Oświadczenie: Nie wypróbowałem tego w module cieniującym, po prostu narysowałem kilka schematów i przekonałem się, że „powinno działać” ... więc daj mi znać, jeśli spróbujesz! :)