Specular

Introducción

Si miramos en la wikipedia y hacemos un copy&paste obtenemos esto:

Reflexión especular
specular_diagram

La reflexión especular es la reflexión de la luz de una superficie donde la reflexión incidente se refleja (solamente) en un ángulo igual al ángulo de incidencia (ambos tomados con respecto a la perpendicular en ese punto). Tal comportamiento es descrito por la ley de Snell.
Esto está en el contraste para difundir la reflexión. El ejemplo más familiar de la distinción entre la reflexión especular y difusa sería pinturas mates y brillantes según lo utilizado en la pintura casera. Las pinturas mates tienen una parte más elevada de la reflexión difusa, mientras que las pinturas de lustre tienen mayor reflexión especular. La reflexion difusa se produce cuando los rayos de luz chocan con una superficie rugosa (sin forma plana), provocando que los rayos reflejados salgan en direcciones muy distintas (depende de la forma de la superficie).

En pocas palabras nos está diciendo que cuanto más lisa sea la superficie que estamos mirando y cuanto más acerquemos nuestro ojo al punto en que se genera un ángulo igual al de la luz que está entrando (mirar imagen) más brillo veremos.

Cálculo de la componente especular

Para calcular la componente especular en un píxel calcularemos primero el vector ‘Half’. Este vector se calcula mediante las posiciones de la luz, del ojo de la cámara y del píxel. Lo podemos ver a continuación:

float3 Half1 = normalize(normalize(light1_pos - i.PositionPixel) + normalize(eye_pos - i.PositionPixel));

En el código anterior podemos observar como el vector ‘Half’ es la suma entre los vectores que van des de el ojo del a cámara al píxel y la luz al píxel. Evidentemente tenemos que normalizar los vectores para obtener un valor correcto.

Una vez tenemos este valor, procedemos a calcular el coseno de beta, para ello usaremos el siguiente código:

float cos1_beta = saturate( dot( i.NormalPixel.xyz , Half1.xyz ) );

En la línea de código anterior podemos observar como el cálculo del coseno de beta procede del producto escalar entre la normal de nuestro píxel y el vector que hemos calculado anteriormente. Al finalizar este cálculo debemos saturar el valor para que su rango este entre 0.0f y 1.0f

Una vez tenemos el coseno de beta ya podemos calcular la componente especular final. Deberemos especificar nosotros el valor del exponente y el multiplicador de ese valor. Fijémonos:

float specular1_factor = saturate( pow( cos1_beta , Layer1SpecExponent )) * Layer1SpecValue;

En el código anterior, estamos elevando el coseno de beta con un valor que nosotros debemos especificar según el material, posteriormente multiplicamos ese resultado por un factor multiplicativo.

Estos dos valores nos indican cómo se comporta la componente especular.

El exponente ‘Layer1SpecExponent’ nos hace que el brillo de la especular sea más o menos concentrado. Cuanto más alto sea el exponente, más concentrado será el brillo.

El valor multiplicativo ‘Layer1SpecValue’ nos hace que el material sea más brillante o mas mate. Cuanto más pequeño es este valor, mas mate es la superficie y viceversa.

Diferentes exponentes (1.0f - 60.0f)
specular

En la imagen anterior podemos observar un ejemplo de diferentes valores del exponente, concretamente entre el rango de 1.0f y 60.0f

Este es el método estándar para calcular el valor de la componente especular en un píxel cualquiera de la escena. Hemos de tener en cuenta que hemos presupuesto una sola luz iluminando ese píxel.

Especular y fresnel

Fresnel
fresnel

Según pude leer en la wiki de Valve, ellos dicen que cualquier superficie independientemente de lo mate que ésta sea, se convierte en brillante cuando la normal de ésta superficie se acerca a la perpendicularidad con el vector que va desde nuestro ojo hasta esa superficie.

Esta afirmación es cierta pues cuanto más perpendicular es la normal de la superficie con el vector que va desde nuestro ojo a la superficie, mas brilla ésta, y esto se debe a que desde la posición del ojo, más acumulación de reflejos obtenemos, dando como resultado la visión de una superficie brillante aunque esta no lo sea en absoluto.

Si nos fijamos, a la derecha tenemos un diagrama sacado de la wiki de Valve que nos ayuda a entender este efecto. Cuanto más horizontal esta esa superficie de la fotografía, más brillante le resultara para ese ojo que la esta mirando.

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License