Fundamentos de Shaders: Variables y Flujo de Datos en GLSL

Enviado por Chuletator online y clasificado en Plástica y Educación Artística

Escrito el en español con un tamaño de 2,58 KB

Tipos de Variables en Shaders

  • Uniform: Son las variables que se pasan desde la aplicación al shader para enviar datos genéricos de la malla (mesh) o propiedades de la escena, como la posición de la luz, el material del objeto o las matrices para las transformaciones.
  • Varying: Son variables que se pasan del Vertex Shader al Fragment Shader y que son interpoladas linealmente de manera automática acorde a la distancia del píxel con cada vértice. Nos permiten definir propiedades por vértice que luego se extienden a los píxeles vecinos.
  • Attribute: Son propiedades definidas por vértice. Deben pasarse desde la aplicación, una por cada vértice, y sirven para enviar datos como la normal, el color del vértice o las coordenadas de textura. Por lo general, no hace falta definirlas como variables, ya que podemos acceder a ellas usando palabras clave como gl_Vertex, gl_Normal o gl_Color.

Palabras Clave y Flujo de Datos

Lectura (in)

  • gl_Vertex: Contiene las coordenadas del vértice tal y como se introdujeron desde el glVertex en la aplicación. Solo es accesible desde el Vertex Shader.
  • gl_Color: Contiene el color definido desde la aplicación con glColor. Solo es accesible desde el Vertex Shader.
  • gl_Normal: Contiene la normal definida para ese vértice. Solo es accesible desde el Vertex Shader.
  • gl_MultiTexCoord0: Contiene las coordenadas de textura.

Escritura (out)

  • gl_Position: Debe almacenar el vértice transformado en espacio de pantalla (multiplicado por la MVP). Solo disponible en el Vertex Shader.
  • gl_FragColor: Variable donde se almacena el color final del píxel. Accesible solo desde el Fragment Shader.

Ejemplo de Implementación

Vertex Shader

uniform mat4 mvp; // Aquí recibimos la modelviewprojection desde la aplicación
varying vec3 pixel_color; // Para enviar al pixel shader el color

void main() {
    pixel_color = gl_Color.xyz; // Enviamos el color al pixel shader
    gl_Position = mvp * gl_Vertex; // Transformamos el vértice a screen space
}

Fragment Shader

varying vec3 pixel_color; // Aquí viene el color interpolado

void main() {
    gl_FragColor = vec4(pixel_color, 1); // Ponemos el color en el píxel
}

Entradas relacionadas: