Iluminacion #
Calculo de normales #
Los vectores normales o perpendiculares a la superficie son necesarios para calcular el comportamiento de las luces direccionales en la escena.
La técnica más común para hallar los normales de un SDF es utilizar el gradiente
\(n = normalize(\nabla f(p))\)La definicion de gradiente es
\(\nabla f(p) = \lbrace \frac{df(p)}{dx}, \frac{df(p)}{dy}, \frac{df(p)}{dz} \rbrace\)Normalmente en las implementaciones de ray marching se utiliza la aproximación con h > 0 en diferencias centrales
\(\frac{df(p)}{dx} \approx \frac{f(p + h_x) - f(p - h_x)}{2h} \)Finalmente el cálculo de las normales, se ve de esta manera
\(n = normalize(f(p + h_x) - f(p - h_x) , f(p + h_y) - f(p - h_y), f(p + h_z) - f(p - h_z))\)El divisor 2n se elimina, ya que al normalizar, se pierde ese escalado.
Sin embargo, esto requiere calcular 6 veces f(x), teniendo en cuenta que es un fractal, se vuelve costoso rápidamente. Para solucionar esto se implementó la optimización de Paulo Falcao denominada la tecnica del tetraedro.
Ya que h define la diferenciación, también define el detalle de la normal, gracias a esto se puede definir el detalle en función a la distancia de la cámara con el SDF, optimizando así un poco más este cálculo.
Modelo de iluminacion de Phong-Blinn #
Este modelo tiene en cuenta:
- Luz ambiente
- Luz difusa
- Luz especular
y se resume asi
\(f(p) = l_a + l_d(p) + l_s(p)\)Componente ambiente #
\(l_a = I_a * K_l * K_m\)- k_l: Color de luz
- K_m: Color material
- I_a: Intensidad ambiente
Componente difuso #
\(l_d(p) = dot(n(p),l(p)) * k_l * K_m * I_d\)- n(p): Normal en el punto p
- l(p): direccion de la luz desde p l(p) = normalize(l_p - p)
- k_l: color de luz
- k_m: color de material
- I_d: Intensidad difusa
Componente especular #
\(l_d(p) = f_{spec}(l(p), v(p), n(p)) * k_l * K_m * I_s\)- n(p): Normal en el punto p
- v(p): direccion de la caamara desde p v(p) = normalize(c_p - p)
- l(p): direccion de la luz desde p l(p) = normalize(l_p - p)
- f(x): termino especular
- k_l: color de luz
- k_m: color de material
- I_d: Intensidad especular
Termino especular Blinn #
\(f_{spec}(l, v, n) = dot(n, normalize(l + v))^s\)- s: factor de reflejo
Atenuacion de la luz #
Cuanto decae la luz en funcion a la distancia
\(a(l(p)) = \frac{k}{1 + a * l(p) ^ e} \)- k: numerador
- a: atenuacion
- e: potencia
- l(p): direccion de la luz desde p l(p) = normalize(l_p - p)
Oclusion ambiental #
Cuanta luz llega a cada punto de la superficie