Rendere acqua oleosa / inquinata?


19

Tutti i maghi shader là fuori hanno un'idea di come ottenere un effetto acqua oleosa / inquinata, simile a questo:

acqua oleosa

Idealmente, l'acqua non sarebbe uniformemente oleosa, ma invece l'olio potrebbe essere generato da una fonte (come uno scarico inquinante da un impianto chimico) e quindi diffondersi in tutto il corpo idrico. Il mio pensiero per questa parte sarebbe quello di mantenere una "mappa dell'olio" come una trama 2D che determina la densità dell'olio in ogni punto della superficie dell'acqua. Si diffonderebbe e si muoverà naturalmente con la superficie dell'acqua; a quel punto l'oceano (ho una simulazione di particelle d'onda per onde dinamiche e sto già facendo qualcosa di simile per la schiuma sulla superficie dell'acqua). Tuttavia, non sono sicuro di quanto fisicamente corretto sarebbe, dal momento che l'olio potrebbe non muoversi alla stessa velocità dell'acqua.

E non ho idea di come rendere tutti quei colori trippy :-). Pensieri?


Usa una trama ..? Sfumatura radiale cromatica, applicare qualche distorsione ..
bobobobo

@bobobobo - La direzione in cui guardi influenza i colori mostrati, però ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser

1
Ti consigliamo di applicare uno shader basato su en.wikipedia.org/wiki/Thin-film_interference ma non ho idea di come scrivere.
jzx

2
( gamedev.net/page/resources/_/technical/… ) Non riesco a distillare una risposta perché non conosco l'argomento
horatio

Risposte:


25

La base fisica dei colori di una chiazza di petrolio è l' iridescenza e anche correlata agli anelli di Newton . In particolare, lo spessore dello strato di olio è dell'ordine della lunghezza d'onda della luce. Poiché la luce si riflette dalla superficie superiore e inferiore dell'olio, a qualsiasi data lunghezza d'onda, ad alcuni angoli le due riflessioni saranno sfasate e si annulleranno a vicenda; ad altri angoli i riflessi saranno in fase e si sommeranno. Questo accade ad angoli diversi per ogni lunghezza d'onda, quindi illuminare l'olio con la luce bianca produce tutti quei colori. Se lo illuminassi con una sola frequenza (ad es. Luce laser) vedresti solo una serie di anelli chiari e scuri.

Se ignori la rifrazione nello strato di olio, semplicemente elaborando la geometria della situazione, puoi scoprire che la luminosità della luce riflessa per una determinata lunghezza d'onda dovrebbe variare come

sin(2.0 * pi * oilThickness / (dot(L, H) * wavelength)) * 0.5 + 0.5

Teoricamente questo dovrebbe essere integrato su tutte le lunghezze d'onda, ma in pratica probabilmente puoi semplicemente farlo per rosso, verde e blu - diciamo rispettivamente 700, 550 e 400 nm. La modifica dello spessore dell'olio modifica il raggio apparente degli anelli di colore. Avrei probabilmente 2.0 * pi * oilThickness / wavelengthincluso un singolo valore RGB fornito allo shader come valore uniforme. Potresti moltiplicarlo per una trama per simulare lo spessore variabile dell'olio, se lo desideri - questo è probabilmente ciò che dà la maggior parte della trama interessante nell'immagine sopra.

Questo produce un valore di colore RGB che puoi moltiplicare nel tuo BRDF. Il dot(L, H)fattore verrebbe utilizzato per le luci puntiformi / direzionali e puoi sostituirlo dot(N, V)per applicarlo anche a un riflesso della mappa ambientale.

Disclaimer: non ho provato questo in uno shader, ho appena disegnato alcuni diagrammi e mi sono convinto che "dovrebbe funzionare" ... quindi fammi sapere i risultati se lo provi! :)


Roba forte. Il motivo per cui ci sono riflessi sulla superficie dell'olio superiore e inferiore è perché alcune onde si riflettono sulla parte superiore mentre altre sono appena rifratte. Queste onde rifratte avanzano verso la superficie del fondo, dove possono essere nuovamente rifratte o riflesse.
dsilva.vinicius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.