Torre de Babel

Cómo comunicar un vertex shader con un pixel shader

by Francisco Charte.

Como se apuntó en un tutorial previo, los VS y PS pueden comunicarse a través de parámetros varying. Para ser más exactos habría que decir que el VS puede entregar información al PS, por ejemplo a través de los campos gl_FrontColor y gl_TexCoord[N]. También pueden declararse parámetros varying a medida, declarándolos antes de la función main() con la siguiente sintaxis:

varying tipo nombre;

Esta declaración se haría tanto en el VS como en el PS, de forma que el segundo pueda leer el valor asignado por el primero.

El código siguiente es un ejemplo de VS en el que se modifica el parámetro uniforme gl_FrontColor, usado por el PS que genera por defecto Shader Maker para dar color a los fragmentos. Lo que se hace es aplicar una modificación periódica a cada componente, excepto el canal alfa. En este caso la posición de los vértices no se altera.

uniform float time; // Tiempo que lleva ejecutándose el shader

void main()
{
    vec4 v = gl_Vertex; // Tomamos el vertice de origen

    // Se aplica establece el vértice transformado como posición
    gl_Position    = gl_ModelViewProjectionMatrix * gl_Vertex;

    // Se aplica una transformación variable y periódica
    v.x = v.x * abs(sin(time)) + 0.1;
    v.y = v.y * abs(cos(time)) + 0.1;
    v.z = v.z * abs(sin(time)) + 0.1;

    // Modificamos el color que se aplicara a las primitivas
    gl_FrontColor  = vec4(v.xyz,1.0);

Al ejecutar este shader se verá cómo el color aplicado a la geometría va cambiando, algo que no es posible apreciar en una captura de pantalla. En el caso del cubo se produce una suave transición en los colores de cada esquina, variando del verde al robo, magenta, azul, negro, etc.

En la próxima entrega abordaremos el desarrollo de nuestro primer pixel shader.