9. Creación de sombras en WebGL

Objetivos
  • Añadir sombras a una escena con iluminación
  • Usar una textura como buffer alternativo par guardar datos.
  • Pintar "dos veces"
  • Como se pudo ver el trabajo anterior no mostraba ningún concepto de sombras, ya que solo se aumentaba la iluminación de un fragmento de acuerdo a la luz recibida. Ahora es necesario ubicarse desde la posición de la fuente de luz y calcular la distancia que hay a todo vertice/fragmento, la cual va a ser guardada como textura. [1] Si un fragmento es el que esta a menor distancia de la luz, va a tener luz. Si un pixel eta mas lejos que otro respecto al rayo, va a estar coloreado de negro o de la luz ambiental (sombra).
    Distancia desde la luz guardada [2]

    Guardar una textura alternativa

    ¿Cómo se logra este cálculo? Antes que nada es necesario saber que vamos a inlcuir un concepto que no se ha realizado previamente: un doble renderizado. Uno de ellos va a ser un render tomando la luz como fuente de la cámara con la instrucción lookAt cálculando distancia (z-depth) hasta cada pixel. Esto va a ser el determinante si un pixel se encuentra afectado o no por la sombra.

    Nuevos elementos en el vertex shader[5]

    Fragment S. Resultado de tener sombra[5]

    Mas adelante miramos cómo evaluan si se encuentra en una sombra o no. Más adelante se ve como se adquirio dicha matriz. Por lo pronto Uno de ellos se va a guardar como textura alternativa de un primer renderizado conteniendo los datos necsarios para pintar la sombra. Se puede escuchar extraño pero si miramos el mismo canvas es una textura [3]. Dicha textura va a renderizar el mundo desde la posición de la luz midiendo la distancia a los vertices. Dicho datos va a servir como entrada al segundo conjunto de shaders. Ambos van a ser usados en el mismo programa de renderizado. [4]

    Renderizar datos de la textura como sombra

    Una vez guardados los datos, dicho atributo es leído por el shader general de la escena.

    El código resultante se puede ver aquí. El seguimiento del trabajo realizado se encuentra en este sprint .


    Bibliografia:
    1. Wikipedia.org - Shadow mapping
    2. OpenGL Tutorial - Tutorial 16 : Shadow mapping
    3. WebGL Fundamentals, WebGL Rendering to a Texture
    4. MIT - WebGL Tutorial: Directional Shadow Mapping without extensions
    5. Learn WebGL - 11.5 - Shadows

    Comentarios

    Entradas populares