4. Iluminacion

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

http://frederikaalund.com/wp-content/uploads/2014 /03/Graphics_Alchemy.svg

Implementacion #

Referencias #