Cuando implemento la ley de Beer (absorción de color a distancia a través de un objeto), nunca se ve muy bien por alguna razón.
Cuando tengo el color detrás del objeto, calculo el color ajustado de esta manera:
const vec3 c_absorb = vec3(0.2,1.8,1.8);
vec3 absorb = exp(-c_absorb * (distanceInObject));
behindColor *= absorb;
Eso me dará algo parecido a esto (nota un poco de refracción aplicada):
Tenga en cuenta que esto se implementa como un juguete de sombreador aquí .
Eso cumple con la descripción de lo que hace la ley de Beer, pero no se ve muy bien, no cuando se compara con disparos como este:
Dejando a un lado los detalles especulares, estoy tratando de descubrir la diferencia. ¿Podría ser que mi geometría es demasiado simple para mostrarla realmente bien? ¿O lo estoy implementando incorrectamente?
3d
refraction
transparency
Alan Wolfe
fuente
fuente
Respuestas:
Su imagen definitivamente no se ve correcta, y parece que no está calculando correctamente la ruta interna de los rayos de luz a medida que viajan a través de su malla. Por lo que parece, diría que está calculando la distancia entre el punto donde el rayo de visión ingresa por primera vez al cubo y donde primero golpea la pared interior, y lo usa como su distancia de absorción. Esto supone esencialmente que la luz siempre saldrá del vidrio la primera vez que golpee una pared, lo cual es una suposición pobre.
En realidad, cuando la luz entra al vidrio desde el aire, a menudo no sale inmediatamente del vidrio. Esto se debe a que cuando la luz incide en la interfaz vidrio / aire, puede ocurrir un fenómeno conocido como reflexión interna total (TIR). La TIR ocurre cuando la luz viaja desde un medio con un índice de refracción más alto (IOR) a uno con un IOR más bajo, que es precisamente lo que sucede en el caso de que la luz golpee la pared interior de un objeto de vidrio. Esta imagen de Wikipedia es una buena demostración visual de cómo se ve cuando ocurre:
En términos básicos, lo que significa es que si la luz incide en un ángulo poco profundo, la luz se reflejará completamente en el interior del medio. Para dar cuenta de esto, debe evaluar las ecuaciones de Fresnelcada vez que su rayo de luz golpea una interfaz de vidrio / aire (también conocida como la superficie interior de su malla). Las ecuaciones de Fresnel le indicarán la relación entre la luz reflejada y la cantidad de luz refractada, mientras que será 1 en el caso de TIR. Luego puede calcular las direcciones apropiadas de luz reflejada y refractada, y continuar trazando el camino de la luz a través del medio o fuera de ella. Si asume una malla convexa simple con un coeficiente de dispersión uniforme, entonces la distancia a usar para la ley de Beer será la suma de todas las longitudes de camino interno antes de salir del medio. Así es como se ve un cubo con sus coeficientes de dispersión y un IOR de 1.526 (vidrio de cal sodada), renderizado usando mi propio trazador de ruta que tiene en cuenta las reflexiones y refracciones internas y externas:
En última instancia, los reflejos internos y las refracciones son una parte importante de lo que hace que el vidrio parezca vidrio. Las aproximaciones simples realmente no son suficientes, como ya lo ha descubierto. Se pone aún peor si agrega múltiples mallas y / o mallas no convexas, ya que no solo tiene que tener en cuenta los reflejos internos, sino que también debe tener en cuenta los rayos que salen del medio y entran en un punto diferente.
fuente
Here is what a cube looks like (...) using my own path tracer.
¿Por casualidad lo tienes de fuente abierta?