Tornando água oleosa / poluída?

19

Quaisquer assistentes de shader por aí têm uma idéia de como obter um efeito de água oleosa / poluída, semelhante a este:

água oleosa

Idealmente, a água não seria uniformemente oleosa, mas, em vez disso, o óleo poderia ser gerado a partir de alguma fonte (como um dreno poluente de uma planta química) e depois difundir-se por todo o corpo d'água. Meu pensamento para esta parte seria manter um "mapa do petróleo" como uma textura 2D que determina a densidade do óleo em cada ponto da superfície da água. Ele se difundiria e se moveria naturalmente com a realidade da água naquele ponto (eu tenho uma simulação de partículas de onda para ondas dinâmicas e já estou fazendo algo semelhante para a espuma na superfície da água). No entanto, não tenho certeza de quão fisicamente correto isso seria, pois o óleo pode não se mover na mesma velocidade que a água.

E eu não tenho idéia de como fazer todas aquelas cores de viagem :-). Pensamentos?

Robert Fraser
fonte
Use uma textura ..? Gradiente radial cromática, aplicar alguma distorção ..
bobobobo
@bobobobo - A direção você olha para ele influências que as cores são mostrados, embora ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Você deseja aplicar um sombreador com base em en.wikipedia.org/wiki/Thin-film_interference, mas não tenho idéia de como escrever um.
JZX
2
( Gamedev.net/page/resources/_/technical/... ) eu não posso destilar a uma resposta, porque eu não sei o tópico
horatio

Respostas:

25

A base física das cores de uma mancha de óleo é a iridescência e também está relacionada aos anéis de Newton . Especificamente, a espessura da camada de óleo é da ordem do comprimento de onda da luz. Como a luz reflete da superfície superior e inferior do óleo, em qualquer comprimento de onda, em alguns ângulos, as duas reflexões estarão fora de fase e se cancelarão; em outros ângulos, as reflexões estarão em fase e serão somadas. Isso acontece em ângulos diferentes para cada comprimento de onda, portanto, iluminar o óleo com luz branca produz todas essas cores. Se você a iluminasse com uma frequência única (por exemplo, luz laser), você veria apenas uma série de anéis claros e escuros.

Se você ignorar a refração na camada de óleo, apenas calculando a geometria da situação, poderá descobrir que o brilho da luz refletida para qualquer comprimento de onda deve variar como

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

Teoricamente, isso deve ser integrado em todos os comprimentos de onda, mas, na prática, você provavelmente pode fazê-lo apenas em vermelho, verde e azul - digamos 700, 550 e 400 nm, respectivamente. Alterar a espessura do óleo alterará o raio aparente dos anéis de cor. Eu provavelmente agruparia o valor 2.0 * pi * oilThickness / wavelengthem um único RGB fornecido ao shader como um valor uniforme. Você pode multiplicá-lo por uma textura para simular diferentes espessuras de óleo, se desejado - provavelmente é o que fornece a maior parte da textura interessante na imagem acima.

Isso produz um valor de cor RGB que você pode multiplicar em seu BRDF. O dot(L, H)fator seria usado para luzes pontuais / direcionais, e você pode substituir dot(N, V)por aplicar isso também a uma reflexão do mapa do ambiente.

Isenção de responsabilidade: eu não tentei isso em um shader, apenas desenhei alguns diagramas e me convenci de que "deveria funcionar" ... então, deixe-me saber os resultados, se você tentar! :)

Nathan Reed
fonte
Coisas legais. A razão pela qual há reflexos nas superfícies de óleo superior e inferior é porque algumas ondas são refletidas no topo, enquanto outras são apenas refratadas. Essas ondas refratadas avançam para a superfície do fundo, onde podem ser refratadas novamente ou refletidas.
precisa saber é o seguinte