¿Qué son los shaders?
Shader: “Un procedimiento de sombreado e iluminación que permite al
artista/programador especificar el renderizado de un vertex o de un pixel”.
Esta es la definición dada por el programa RenderMan de Pixar en 1989, que sería usado para la realización de la película Toy Story (1995).
Por estas mismas fechas comenzó una revolución en el mundo de las tarjetas gráficas de PC que fue dotando a las mismas de más y más potencia. En 1999 se produce un importante salto cualitativo en el terreno de las tarjetas gráficas al presentar nVidia la GeForce 256 que supuso el inicio de las GPUs (Graphics Processing Units) programables.
A grandes rasgos, los shaders son simples programas que transforman un vértice (denominado vertex) o bien un pixel (denominado fragment por OpenGL de forma más correcta como veremos más adelante, aunque probablemente esté mas extendida la propia denominación de pixel).
Para cada vertex, se llama a un vertex shader en una primitiva. Una vez que el vertex es procesado por el shader, la primitiva es ensamblada y procesada, siendo renderizada como una serie de pixels que pueden a su vez ser procesados por un pixel shader para ser luego pintados.
Así, los shaders reemplazan una sección del hardware de vídeo que típicamente se denomina pipeline de función fija (Fixed-Function Pipeline o FFP). Esto es porque reemplazan tanto la transformación de vértices como la iluminación y mapeado de textura “fijos” del hardware (es decir, no programable) por una forma programable. Con la introducción de los shaders disponemos de la opción de tomar el control para conseguir cualquier efecto que queramos, o dejar que el FFP decida por nosotros.
Actualmente, los shaders no sólo sirven para iluminación y sombreado, como indica su nombre, sino que además sirven para crear efectos gráficos más ricos, como animaciones, efectos de partículas, etc.
Veamos de forma un poco más rigurosa las definiciones de Vertex Shader, Pixel Shader y Fragment Shader.
Un Vertex Shader (VS) es una función de procesado gráfico que manipula los valores de un vertex en un plano 3D mediante operaciones matemáticas sobre un objeto. Estas variaciones pueden ser diferencias en el color, en las coordenadas de la textura, en la orientación en el espacio o en el tamaño del punto.
Cuando el VS está activado, reemplaza al pipeline de función fija para la transformación de vértices. El shader no opera sobre una primitiva (un triángulo, por ejemplo), sino sobre un solo vertex cada vez; además no puede crearlos ni destruirlos sino solamente manipularlos. El programa shader se ejecuta para cada vertex que deba ser procesado.
De forma análoga al vertex shader, se define un Pixel Shader (PS) como un pequeño programa que procesa fragments (algo así como pixels con más datos) y que se ejecuta en la GPU. Al crear un PS, se crea una función de procesado de fragmentos que manipula datos de fragmentos.
Frecuentemente necesitan datos del VS, llegando incluso a veces a ser “conducidos” por éste. Por ejemplo, para calcular una iluminación por pixel, el PS necesita la orientación del triángulo, la orientación del vector de luz y en algunos casos la orientación del vector de vista.
Un Fragment Shader (FS) es lo mismo que un PS. El nombre de fragment viene de que una escena 3D es proyectada en el plano x-y (2D) donde los puntos son llamados fragmentos. Un fragmento contiene no sólo información de color del punto sino también otra información tal como la posición y las coordenadas de la textura por ejemplo. Diversos fragmentos pueden ser unidos para mostrar finalmente un pixel en la pantalla.