Se entiende como shader a un script especifico con lenguaje GLSL o HLSL en la que las instrucciones del script se comunican y se ejecutan directamente en la placa de video sin pasar por el procesador . Esta ejecución directo en la placa de video es la que nos permite ahorrarnos el problema de la memoria y el procesador de la computadora a la hora de procesar esa información grafica (asi es como existen intros 4kb alucinantes y super realistas que pesan tan poco). Esto también conlleva una limitación que es que los scripts de shaders solo pueden recibir información de variables externas (uniforms), pero esa información solo puede salir en formato de textura, es decir, es imposible utilizar un shader para asignar el valor de un float,bool,int o cualquier tipo de dato primitivo y que eso salga del alcance del shader. Las salidas de los shaders siempre son en texturas(información de imagen). Tomado de mmtt.com.arg
Fragment shader : este tipo de shader fue creado originalmente para manejar el color de las texturas que se aplican a los objetos 3D, pero dada su dinamismo a la hora de procesar los pixeles se inventaron tecnicas como RayMarching que permiten simular luces, y escenarios 3D super realistas solamente utilizando codigo.
Vertex Shader : Los vertex shaders son utilizados para procesar información de los vertices de una figura. Es decir, lo puntos que conectan con otros puntos que hace que se genere un triangulo, y mediante muchos de esos triangulos es como se componen los modelos 3D. Los vertex shader permiten modificar la posicion de estos puntos de vertices.
Compute shader : Los compute shaders son shaders utilizados para computar una gran cantidad de datos utilizando la tecnologia propia de los shaders. Esto sirve por ejemplo para hacer sistemas de particulas con millones y millones de particulas. A esta tecnica se la conoce como GPU INSTANCING.
Tomado de mmtt.com.arg
Estructura general con la que funcionan el vertex y fragment shader:
CODE - Two colors interpolated with patterns in p5js
#
CODE - Three Colors interpolated with patterns in p5js
#
El campo de la informática visual, donde se utilizan computadoras para generar imágenes visuales y espaciales del mundo real se conoce como computación gráfica.
El texturizado en computación gráfica es una técnica muy común utilizada para añadir detalles a la superficie de un objeto. Con un objeto lo que se puede hacer es renderizarlo como un objeto difuso, por ejemplo, utilizando un color sólido para todo el objeto. Si se requiere que el objeto no tenga solo un color sólido, la solución alternativa es dividir el objeto en partes más pequeñas y dar un valor o color único a cada parte del objeto. Romper el objeto para seguir la forma de los detalles de la textura que se quiere aplicar a la superficie de un objeto lleva mucho tiempo y, aunque funciona si el patrón aplicado está hecho sólo de colores sólidos, no funciona si se desea aplicar algunos gradientes de colores en la superficie del objeto.
En computación gráfica el patrón aplicado a la superficie de un objeto puede ser una imagen, pero también puede generarse mediante algún tipo de ecuación matemática. Está segunda técnica se denomina texturizado procedimental. La ventaja de este enfoque es el bajo costo de almacenamiento, la resolución ilimitada de las texturas y la facilidad de mapeo de las mismas. Este tipo de texturas se utiliza a menudo para modelar representaciones superficiales o volumétricas de elementos naturales como la madera, el mármol, el granito, el metal, la piedra y otros.
Algunos tipos de estás texturas son:
Texturizado sólido: es un proceso en el que la función generadora de texturas se evalúa sobre R3 en cada punto de la superficie visible del modelo, de modo que las propiedades del material resultante (como el color, el brillo o la normalidad) sólo dependen de su posición en 3D, y no de su posición parametrizada en la superficie en 2D, como en el mapeo tradicional de texturas en 2D.
Textura celular: esta textura se basa en puntos de características que están dispersos en un espacio tridimensional, puntos se utilizan para dividir el espacio en pequeñas regiones al azar llamadas celdas que suelen tener el aspecto de “escamas de lagarto” o “losas”. Aunque estas regiones son discretas, la propia función de base celular es continua y puede evaluarse en cualquier lugar del espacio. El ruido de Worley es un tipo común de textura celular.
Texturas genéticas: es un enfoque experimental para generar texturas en la cual se modela el resultado final con ayuda de un usuario quien decide cuándo una textura es la adecuada. Como el resultado es difícil de controlar, este método se suele utilizar sólo para texturas experimentales o abstractas.
Son baldosas cuadradas decoradas con patrones que no son rotacionalmente simétricos. Cuando se colocan en un mosaico cuadrado del plano, pueden formar patrones variados, y la orientación de cada azulejo puede utilizarse para visualizar información asociada a la posición del azulejo dentro del mosaico.
A continuación se presenta una fotografía de los azulejos de la Catedral Santa María de la Huerta de Tarazona, perteneciente a la entrada Simetrías I en la Catedral de Tarazona del blog MateTurismo, de Angel Requena.
En 1704, Sébastien Truchet estudió todos los posibles patrones formados por los triángulos rectos orientados en las cuatro esquinas de un cuadrado.
Este tipo de patrones se han estudiado ampliamente y se han generalizado para incluir otros conjuntos de azulejos que no son rotacionalmente simétricos. En la siguiente imagen, se indica un mosaico Truchet tradicional, luego se indica un mosaico con diagonales y, finalmente, se indica cuartos de círculo, centrados alrededor de los vértices donde las diagonales solían tocarse (estos mosaicos, introducidos por Cyril Stanley Smith, crean interesantes patrones de caminos y círculos en forma de manchas).
El mapeo de texturas es un método para añadir realismo a un gráfico generado por ordenador. Una imagen (la textura) se añade (mapea) a una forma más simple que se genera en la escena, como una calcomanía pegada a una superficie plana. Esto reduce la cantidad de computación necesaria para crear las formas y texturas en la escena. Por ejemplo, se puede generar una esfera y mapear una textura de cara, para eliminar la necesidad de procesar la forma de la nariz y los ojos.
Algunos tipos de mapeo de textura son los siguientes:
Mapeo difuso: es el tipo más común de mapeo de textura. Define el color y el patrón del objeto, es como pintar una imagen en la superficie del objeto.
Mapeo especular: se utilizan para definir el brillo/resplandor de una superficie. Normalmente, un mapa especular es una imagen en blanco y negro que mapea el valor de brillo en un objeto. Cuanto más blanco sea el píxel, más brillante será el objeto en ese lugar específico de la textura.
Mapeo de Oclusión Ambiental: es un mapa en escala de grises que contiene datos de iluminación. No se suele utilizar como mapa propio, sino que se suele combinar con el mapa difuso para crear sombras suaves.
Mapeo Normal: es una técnica que permite dar iluminación y relieve más detallado a la superficie de un objeto. Este mapeo permite representar detalles de la superficie, como arrugas, arañazos y bordes biselados, almacenando las correspondientes normales de la superficie en una textura.
Para la realización del ejercicio, tuvimos en cuenta los patrones de The book of Shaders y el tutorial de ShaderToy - Truchet Tiling Explained [6].
Para la implementación, la idea principal es dividir el shader con frag y crear los patrones, para lo cual se usó una función aleatoria. Luego se emplea como una textura dentro de un Cubo.
Los shaders son muy flexibles y tienen gran utilidad ya que cada uno de sus uniforms se pasan desde la interfaz, y por sus propiedades, se renderiza de una manera muy rapida en la pagina, ademas permite customizar cualquier tipo de objeto con el patron que se realiza en el shader, como trabajo futuro esta hacer masking y mapping de aun mas complejidad para reforzar todo lo visto en la investigación de esta interesante tematica.