martes, 29 de septiembre de 2015

Shaders: Esos que todos nombran y pocos saben lo que son


Es común que cuando alguien compra una tarjeta gráfica o lee un artículo sobre videojuegos, lea esta palabra. Normalmente no tienen mayor relevancia salvo para indicarnos que el producto es la leche por tener más que la versión anterior. Muy bien, ¿pero qué son y cómo nos influyen?

Qué son

Como algunos sabréis, un programa o un juego, se compone de funciones. Así, podemos encontrar una función de disparo que llama a la función que pinta el fogonazo, manda reproducir un sonido de disparo y genera una bala que con su propia función se irá moviendo.

En el caso de los shaders, también hablamos de funciones (algoritmos si nos ponemos técnicos). Un shader es un algoritmo que calcula cómo responde un punto de un objeto ante la luz. De este modo, si le da una luz roja, de una sirena por ejemplo, el shader calculará que un punto de la pared debe enrojecerse dependiendo de la distancia con la fuente de luz, su intensidad, otras fuentes de luz, la oclusión ambiental, etc. Además, tendrá en cuenta la opacidad del material, si es brillante o mate y un sin fin de posibilidades que se tarda mucho más en enumerar que en calcular.

Para qué se usan

Pues como he comentado antes, se usan para colorear píxeles alterando el color original de su textura. Es decir, tenemos una pared blanca, le acercamos la luz roja de la sirena y se tiene que ver roja. Cuanto más lejos esté la fuente de luz, menos roja se verá esa parte de la pared.

¿Qué pasa si entre la luz y la pared hay un borracho meando? Pues que seguramente el policía que activó la sirena le multará, pero aparte de eso, la fuente de luz se ve bloqueada, por lo que el shader debe aplicar una sombra que oscurezca ese punto de la pared y tiene que calcular cuánto se oscurece. Si se quiere hacer sencillo y cutre, se hace una media del color de la textura con el de la sombra. Si se quiere hacer bien, se tendrá en cuenta la oclusión ambiental, que no es más que calcular la iluminación que proporcionarían el sol o la luna.

Pensaréis que eso es el shader sin más, pero no. Esa es sólo su utilidad original. Una vez se vio que se podía aprovechar esto para otras cosas, comenzaron a aparecer técnicas como el famoso bump mapping, la niebla, los reflejos, siendo algunos efectos de posprocesado como el desenfoque, o lo que es lo mismo, aplicados después de generar la imagen 2D del escenario 3D igual que si hiciésemos una foto del escenario y luego le aplicásemos photoshop.

Aquí podéis apreciar el sombrado y el efecto de las luces

Cómo se usan

Hay distintos lenguajes de programación de alto nivel para ello. De alto nivel significa que tú escribes algo sencillo y el lenguaje, compilador en realidad, ya se encarga de pelearse con el hardware para que haga lo que tú quieres. En este caso las tarjetas gráficas poseen montones de núcleos (pipelines) que ejecutan las tareas que les indicas. Cada uno de esos núcleos ejecutará un shader, pudiendo ser de distinto tipo, como la iluminación, el sombreado, el reflejo en el agua, la niebla que clarea un píxel más cuanto más lejos esté de la cámara, etc.

Shaders por hardware

Este tipo de shaders se divide en tres tipos:
  • Vertex shader: Sirve para aplicar transformaciones a un vértice en la malla de un objeto. Lo más básico es que muevas el objeto y entonces los vértices de ese objeto se muevan también, pudiendo rotarse. También sirven para transformar los objetos en otro, haciendo que el pelo de Goku se ponga de punta cuando se transforme en SSJ por ejemplo. Son los primeros en ejecutarse.
  • Geometry shader: Son de los más modernos, requiriendo al menos DX10, por ejemplo. Su función es recibir como entrada los vértices y crear las líneas que los enlaza, pudiendo recibir un octógono y convertirlo en un círculo creando más puntos intermedios, aunque para eso podría haber recibido un círculo directamente, pero bueno.
  • Fragment shader: Recibe cada uno de los fragmentos generados en el paso anterior e interpola (hace una media) entre los vértices para calcular los colores y sombras que mencionaba antes.
La versión del Shader Model es importante en las tarjetas, porque indica qué tipo de órdenes se le pueden dar a la tarjeta. Así, en la versión 1.0 le ordenas sentarse al perro y en la 2.0 le pides que se tumbe. Con cada nueva versión aparecen nuevas características que facilitan la aceleración por hardware de esas funciones.

Aquí tenemos un ejemplo de reflejo y un destello posprocesado.

Conclusiones

He tratado de explicarlo de forma cercana a todos los que no están muy puestos en el tema. Obviamente el tema es bastante más complejo por dentro, pero espero que os haya servido para entender un poco mejor cómo funcionan nuestros queridos juegos.

Si gusta el artículo, la próxima vez os hablaré de bump mapping, parallax, rotorscopia o el efecto que os interese. Si lo conozco, os lo explico y si no, investigo, que también me gusta aprender.

16 comentarios:

  1. Mis dies hamijo

    Me ha gustado mucho el artículo, y eso que ya sabía más o menos de que iba lo de los shader (de cuando creaba mapas para UT99 >.<) pero saber los distintos tipos y que hace cada uno ha sido muy interesante, además de que no se me ha hecho para nada aburrido el artículo, esperaré más de este tipo en el futuro :P

    ResponderEliminar
    Respuestas
    1. Podría haberme extendido más, pero mi profesora de japonés decía que sólo podíamos aprender bien 5 cosas al día. Yo creo que era una excusa para no enseñarnos demasiado rápido y quedarse sin alumnos. xD

      Eliminar
  2. muy instructivo, y diría incluso fundamental, ya que la única diferencia entre esta generación y la pasada precisamente son los brillis brillis...

    ResponderEliminar
    Respuestas
    1. Bueno, el brillis-brillis se crea también con los shaders y una fuente de partículas (suena científico, pero no). La fuente de va a crear vértices sin polígonos y éstos van a ser procesados por el Brillis-Brillis Engine, digo por los shaders.

      Eliminar
  3. Y yo pensé que eran para ahorrar polígonos ver la cara del calvo del crisis 3 para confirmarlo por esas sierras.

    ResponderEliminar
    Respuestas
    1. https://encrypted-tbn3.gstatic.com/images?q=tbn:ANd9GcRxLnyykHXfIuf5w9_hpXuMxMFQSy-746oXnf9AqUbaMemw-cJmSIsovW3B1A

      Eliminar
  4. Sino mal lo recuerdo, el serious sam 1, tenia un cuarto para probar todo eso, igual un video de ese cuarto era mas rapido para explicar que es cada cosa (aunque honestamente no lo pienso buscar xD).

    ResponderEliminar
    Respuestas
    1. Pues no lo conozco, pero mi idea era explicarlo con mis palabras y mascadito para los legos en la materia. Hay muchas explicaciones sobre el tema, pero casi todas son demasiado técnicas para el niño rata que va a defender su juego frente al de la competencia porque en las noticias dijeron algo de los shaders y lo va a repetir sin saber qué significa.

      Eliminar
    2. Desgraciadamente mi disco del primer serious sam paso a mejor vida y en el hd no viene, pero decia para ejemplificarlo a detalle sobretodo porque seria facilmente manejable (solo es entrar a "x" cuarto que dice vertex shader, mapping, aliasing, etc, queda que ni mandado a hacer para un post explicativo xD).

      Eliminar
    3. Parece que mola. Seguramente era algo que usaban para probar el motor gráfico. Ahora quiero ver el vídeo. :P

      Eliminar
    4. Bueno es que el motor del primer Serious Sam en su epoca era otra cosa, ver practicamente 100 enemigos (distintos la mayoria) o mas, con cuatro jugadores al mismo tiempo y corriendo mejor que Unreal 99... eso era hermoso.

      Eliminar
  5. Respuestas
    1. Debe ser muy divertido perder el tiempo libre del puente del pilar en entrar aquí para decir eso. Yo preferí invertirlo en viajar a la capital, ver el desfile de las fuerzas armadas, salir con los amigos, visitar la ciudad... Vamos, lo normal cuando se tiene una vida. Tal vez me puedas enseñar dónde está la gracia de perder el tiempo a tu manera. ;)

      P.D.: Te iba a escribir sólo para mostrarte que no está muerto, pero ya que me pongo a escribir...

      Eliminar
  6. Escribí en esta mierda y el comentario no salió...puta bida xD

    ResponderEliminar
  7. Ok, aquí voy nuevamente (ojalá salga esta vez). Lo que quería decir es que sería bonito si hicieras un artículo sobre ANTIALIASING Y FILTROS ANISOTRÓPICOS.

    [img]https://upload.wikimedia.org/wikipedia/commons/8/80/Anisotropic_filtering_en.png[/img]

    Son siempre entretenido de leer (mientras no tengan una sobredosis de datos y tecnicismos innecesarios). De paso ahorraría el trabajo de escribir y directamente mandaría a los pobres diablos a leer el artículo para instruirse un rato. El otro día me encontré una joya de alguien que decía que los dientes de sierra eran por culpa de las malas TVs (que según ellos no les aparecía en sus Teles mastar race...) y que daba lo mismo si un juego era sandbox o pasillo porque la gráfica se veía borrosa igual unos pasos más allá del personaje. Fue glorioso.

    ResponderEliminar