Torre de Babel

Cómo programar un pixel shader sencillo

by Francisco Charte.

Los PS son programas con una estructura muy similar a la de los VS, si bien los parámetros de entrada y salida sobre los que trabaja son diferentes. La finalidad de un PS básicamente es la de definir el color que tendrá un fragmento o pre-píxel, normalmente usando información procedente de la geometría, texturas, etc.

El color de entrada se recibe en el parámetro gl_Color, que no debe confundirse con el parámetro del mismo nombre existente en los VS. Este parámetro contiene el color obtenido a través de una interpolación en la que intervienen los varying gl_FrontColor y gl_BackColor, normalmente establecidos por el VS, y la orientación que tenga la geometría a la que corresponde el fragmento.

Los parámetros de salida del PS serán dos: gl_FragColor y gl_FragDepth. El primero indica el color a aplicar al fragmento, mientras que el segundo determina el valor que se escribirá en el buffer de profundidad.

El caso más sencillo de PS es aquél en el que se asigna un valor constante al color de cada fragmento. Tomando como punto de partida el estado en el que se encuentra Shader Maker cuando es iniciado, el código del PS sería el que puede verse en la parte derecha de la figura inferior: la asignación a gl_FragColor de un vector constante. En el panel de la izquierda se ve el efecto sobre la famosa tetera: al tener todos los puntos el mismo color, no se aprecian bordes ni profundidad.

PS que asigna un color constante a cada fragmento

Lo habitual es que a gl_FragColor se le asigne el varying gl_Color, es decir, el color obtenido de la interpolación antes citada. Manipulando ese gl_Color, por ejemplo aplicando un factor multiplicativo, sería posible suavizar o potenciar los colores, según el parámetro empleado.

Los efectos más interesantes se obtienen, como veremos en la próxima entrega, comunicando el PS con el VS. De esta forma es posible definir esquemas de coloreado e iluminación a medida. En la web es posible encontrar, por ejemplo, shaders que aplican el conocido esquema de iluminación de Phong usando un VS conjuntamente con un PS.