En esta saga te enseñaré lo básico para empezar en este mundillo, porque es tan secreto, porque es poderoso saber y qué impacto ofrece a la industria. Llevo un tiempo buscando un manual que me enseñe el secretismo oculto detrás de los #shaders y resulta que ha sido difícil encontrar información útil en español, ha sido celosamente guardada por las compañías desarrolladoras.
Te garantizo que si dominas los principios, tus #videojuegos lucirán mucho mejor y su desempeño mejorará notablemente. Saber programar shaders hará que tu videojuego entre por los ojos del jugador y no se resista a jugarlo y tendrás trabajo de por vida en la industria.
Lenguajes existentes:
No son muchos los lenguajes que pueden manipular la gráfica, estos lenguajes están basados en #C y son proveídos por #nvidia y #AMD, no todas las instrucciones sirven a todas las gráficas, por eso son separados en APIs como #Directx 9x, 11x, #OpenGL Es2, Es3. Esto refiriéndose a las capacidades del chip gráfico.
#Unity maneja casi todos las #API y compila una versión compatible para cada dispositivo, disponible de librerías que ayudan a hacer conversiones entre instrucciones, entre APIs, funciones que simplifica mucho el trabajo.
#GPGPL: un lenguaje multi-propósito para calcular cualquier cosa que no sea un shader, en unity se llama #ComputeShaders.
#ShaderLab: que es un lenguaje creado por unity, pero realmente es poco útil, su intención es tratar de simplificar la creación de shaders a través de unos pocos comandos, pero al parecer a la comunidad no le gusta lo fácil y han reducido las capacidades de este como una interfaz entre el motor y los shaders. Unity te da la libertad de escribir el código en GLSL y Cg que tenga certeza.
#GLSL: que es el lenguaje de código abierto de open GL, que se parece en el fondo a C y hay 2 vertientes GL y GLES que es para móviles y web, también tiene la ventaja de tratar de ser un lenguaje bastante universal, no importa la tarjeta que uses, GLSL puede servir para cualquiera.
#HLSL: este es un lenguaje similar a C y es propiedad de microsoft, también trata de ser universal como GLSL y este lenguaje fue co-creado con nVidia. así que la sintaxis se parece y comparten funciones similares.
#CG: lenguaje algo anticuado creado por NVidia, también similar a C pero que aún se sigue utilizando y es casi el standard de la industria, no muchos juegos usan #CUDA, ni físicas, así aun siguen usando CG.
En resumen todos estos lenguajes te dicen una cosa; Aprende C, C++ si te interesa la industria de los videojuegos.
Qué es exactamente un shader:
En computación, cualquier cosa que aparezca en pantalla representando algo gráfico es un shader, con el tiempo durante la evolución de las tarjetas gráficas, estas representaciones han sido volcada hacia estas tarjetas y de ahí que haya la confusión de que los lenguajes de los gráficos son shaders. Así que cualquier lenguaje que usemos con el propósito de representar en pantalla cualquier gráfico, es un Shader.
Qué tipos de shaders hay:
Compute: es el usado por GPGPL lenguaje multipropósito.
Tesselation: solo sirve si la tarjeta gráfica es compatible con Directx 11.
Geometry: es algo ambiguo, porque en funciones de vértice que modifican la posición de los vértices, se puede considerar Geometry.
Vertex: seria la función solo para modificar la posición y el color de los vértices
Pixel: también llamado #fragment debido a que toma un fragmento de la malla y lo rellena con pixeles.
Unity agrega un tipo de shaders llamado Surface, que simplifica los shaders tipo Vertex fragment, pero técnicamente puedes obtener los mismos resultados en ambos.
Cómo funciona un Shader:
Para entender un poco como funciona un Shader, hay que entender un poco la lógica detrás de esta, y en primer lugar hay que entender que no puedes ver el panorama completo, porque una parte es manejada por la CPU y el resto por la GPU y nosotros vemos solo lo que ocurre en esta última.
Primero la CPU dibuja los vértices, los ordena, los separa en grupos de 3, formando triángulos y luego les da color a cada vértice, esto unity no te lo muestra.
luego los envía a la GPU en forma de paquetes llamados structs, este primer paquete contiene la posición y el color de cada vértice, esto tampoco te lo muestra unity
A continuación aquí entra el primer programa o función, la función por vértice y es lo que unity te muestra primero, que lo que hace es manipular los datos interpretados anteriormente, manipularlos y enviar otro paquete.
Este paquete pasa por rasterización, que es una conversión por hardware que hace la tarjeta gráfica para pasar los vértices a pixeles. esto tampoco te lo muestra unity.
Por último este paquete que salió del vértex es tomado por el fragment y es manipulado para colorear cada pixel y luego mandarlo de vuelta al procesador ya procesado para ser puesto en pantalla.
No importa el tipo de shader que represente algo en pantalla, siempre pasa por este proceso.
Por ahora es suficiente, el objetivo es dar un poco de luz de como funciona los shaders y que entienda superficialmente las diferencias entre shaders, con el tiempo iremos profundizando en cada uno de estos conceptos. Nos vemos en el siguiente blog
Comments