¿Renderizando agua aceitosa / contaminada?

19

Todos los asistentes de sombreadores tienen una idea de cómo lograr un efecto de agua aceitosa / contaminada, similar a esto:

agua aceitada

Idealmente, el agua no sería uniformemente aceitosa, sino que el aceite podría generarse a partir de alguna fuente (como un drenaje contaminante de una planta química) y luego difundirse por todo el cuerpo de agua. Mi pensamiento para esta parte sería mantener un "mapa de petróleo" como una textura 2D que determina la densidad del petróleo en cada punto de la superficie del agua. Se difundiría y se movería naturalmente con el agua; ocity en ese punto (tengo una simulación de onda-partícula para ondas dinámicas, y ya estoy haciendo algo similar para la espuma en la superficie del agua). Sin embargo, no estoy seguro de cuán físicamente correcto sería eso, ya que el petróleo podría no moverse a la misma velocidad que el agua.

Y no tengo idea de cómo hacer todos esos colores trippy :-). Pensamientos?

Robert Fraser
fuente
Usa una textura ..? Gradiente radial cromático, aplique algo de distorsión ..
bobobobo
@bobobobo: la dirección en la que miras influye en los colores que se muestran, aunque ... youtube.com/watch?v=NRtUoMG16ZU
Robert Fraser
1
Querrás aplicar un sombreador basado en en.wikipedia.org/wiki/Thin-film_interference pero no tengo idea de cómo escribir uno.
jzx
2
( gamedev.net/page/resources/_/technical/… ) No puedo responder a una respuesta porque no conozco el tema
horatio

Respuestas:

25

La base física de los colores de una mancha de aceite es la iridiscencia , y también está relacionada con los anillos de Newton . Específicamente, el grosor de la capa de aceite está en el orden de la longitud de onda de la luz. Dado que la luz se refleja desde la superficie superior e inferior del aceite, en cualquier longitud de onda dada, en algunos ángulos las dos reflexiones estarán desfasadas y se cancelarán mutuamente; en otros ángulos, los reflejos estarán en fase y se sumarán. Esto sucede en diferentes ángulos para cada longitud de onda, por lo que iluminar el aceite con luz blanca produce todos esos colores. Si lo ilumina con una sola frecuencia (por ejemplo, luz láser), solo verá una serie de anillos claros y oscuros.

Si ignora la refracción en la capa de aceite, solo resolviendo la geometría de la situación, puede encontrar que el brillo de la luz reflejada para cualquier longitud de onda dada debe variar como

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

Teóricamente, esto debería integrarse en todas las longitudes de onda, pero en la práctica probablemente pueda hacerlo solo para rojo, verde y azul, digamos 700, 550 y 400 nm, respectivamente. Cambiar el grosor del aceite cambiará el radio aparente de los anillos de color. Probablemente lo envolvería 2.0 * pi * oilThickness / wavelengthen un solo valor RGB proporcionado al sombreador como un valor uniforme. Si lo desea, puede multiplicarlo por una textura para simular el grosor variable del aceite; eso es probablemente lo que da la mayor parte de la textura interesante en la imagen de arriba.

Eso produce un valor de color RGB que puede multiplicar en su BRDF. El dot(L, H)factor se usaría para luces de punto / direccionales, y puede sustituir dot(N, V)allí para aplicar esto también a una reflexión de mapa de entorno.

Descargo de responsabilidad: no he probado esto en un sombreador, solo dibujé algunos diagramas y me convencí de que "debería funcionar" ... ¡así que avíseme los resultados si lo intenta! :)

Nathan Reed
fuente
Cosas interesantes. La razón por la cual hay reflejos en las superficies de aceite superior e inferior es porque algunas ondas se reflejan en la parte superior mientras que otras simplemente se refractan. Estas ondas refractadas avanzan hacia la superficie inferior, donde pueden refractarse nuevamente o reflejarse.
dsilva.vinicius