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_Normalogl_Color.
Palabras Clave y Flujo de Datos
Lectura (in)
- gl_Vertex: Contiene las coordenadas del vértice tal y como se introdujeron desde el
glVertexen 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
}