Renderujesz oleistą / zanieczyszczoną wodę?

19

Każdy kreator cieniujący ma pomysł, jak uzyskać efekt tłustej / zanieczyszczonej wody, podobny do tego:

oleista woda

Idealnie woda nie byłaby jednolicie oleista, ale zamiast tego olej mógłby być wytwarzany z jakiegoś źródła (takiego jak zanieczyszczający odpływ z zakładu chemicznego), a następnie rozpraszany w jednolitej części wód. Moim pomysłem w tej części byłoby utrzymanie „mapy olejowej” jako tekstury 2D, która określa gęstość oleju w każdym punkcie na powierzchni wody. Rozproszyłby się i poruszałby naturalnie z prędkością wody; w tym momencie (mam symulację cząstek i fal dla fal dynamicznych i już robię coś podobnego do piany na powierzchni wody). Nie jestem jednak pewien, czy byłby to fizycznie poprawny, ponieważ olej może nie poruszać się z taką samą prędkością jak woda.

I nie mam pojęcia, jak zrobić te wszystkie trippy kolory :-). Myśli?

Robert Fraser
źródło
Użyj tekstury ..? Chromatyczny gradient promieniowy, zastosuj pewne zniekształcenie.
bobobobo
@bobobobo - Kierunek, na który patrzysz, wpływa jednak na pokazane kolory ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Będziesz chciał zastosować moduł cieniujący oparty na en.wikipedia.org/wiki/Thin-film_interference, ale nie mam pojęcia, jak zacząć pisać.
jzx
2
( gamedev.net/page/resources/_/technical/… ) Nie mogę odpowiedzieć na pytanie, ponieważ nie znam tematu
horatio

Odpowiedzi:

25

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 / wavelengthpojedynczą 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! :)

Nathan Reed
źródło
Fajne rzeczy. Powodem, dla którego występują odbicia na górnej i dolnej powierzchni oleju, jest to, że niektóre fale odbijają się na górze, podczas gdy inne po prostu załamują się. Te załamane fale przemieszczają się na powierzchnię dna, gdzie można je ponownie załamać lub odbić.
dsilva.vinicius