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 / wavelength
en 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! :)