Fragment Shader

Il fragment shader esegue le ultime operazioni sui frammenti prima che essi subiscano il blending e diventino pixel. Ciascuna istanza del fragment shader ha il compito di calcolare il colore di un singolo frammento ed eventualmente modificare la sua profondità.

Un fragment shader sostituisce le funzioni della Fixed Function Pipeline che agiscono sulla colorazione per singolo pixel, in particolare l'effetto nebbia e l'applicazione delle texture. Se queste sono ancora necessarie, dovranno essere implementate a mano.

I fragment shader sono stati introdotti, contemporaneamente ai vertex shader, a partire da OpenGL 2.0 (GLSL 1.10).

Il fragment shader ha accesso alle seguenti variabili globali predefinite:

vec4 gl_Color;
vec4 gl_FragColor;
float gl_FragDepth;
vec4 gl_FragCoord;

Di queste, le più importanti sono gl_Color e gl_FragColor. La prima contiene il colore originale del frammento calcolato per interpolazione del colore prodotto dal vertex shader in gl_FrontColor o gl_BackColor (o dalla Fixed Function Pipeline se non c'è vertex shader).
Nella seconda deve essere scritto il colore finale del frammento, cioè quello che verrà visualizzato sullo schermo se il depth test ha successo.

gl_FragCoord contiene le coordinate del pixel all'interno della viewport, nel formato x,y,z,w. Normalmente, l'origine è nell'angolo in basso a sinistra dello schermo.
Le coordinate x e y variano da 0.0 al numero di pixel di largezza e altezza della finestra. I pixel sono centrati a metà dell'unità: 0.5, 1.5, 2.5 eccetera. La coordinata z in questo caso indica la profondità del frammento.

Usata raramente, gl_FragDepth può essere scritta per impostare la profondità del frammento. Il valore iniziale di questa variabile è indefinito, non contiene il valore originale della profondità.
Se gl_FragDepth non viene mai citato nel codice dello shader, la funzione della Fixed function Pipeline che calcola la profondità viene ripristinata ed è posto uguale a gl_FragCoord.z / gl_FragCoord.w.

Il fragment shader ha alcune limitazioni:

Il fragment shader è l'unico shader che può usare la parola chiave discard. Quando questa istruzione è eseguita, l'esecuzione dell'istanza dello shader si interrompe e il frammento non è mai visualizzato sullo schermo.

Esempio

Esempio di un semplice fragment shader che si limita ad applicare il colore che riceve in ingresso.

#version 120

void main()
{
  gl_FragColor = gl_Color;
}

Il contenuto del listato sovrastante è rilasciato nel pubblico dominio.

Configurazione per l'esempio

#define SHADER_FOLDER "shaders/simple_fragment/"  // o ../shaders/simple_fragment/ o altro percorso relativo

#define USE_VERTEX_SHADER false
#define USE_FRAGMENT_SHADER true
#define USE_GEOMETRY_SHADER false
#define USE_NORMAL_SHADER false
#define USE_VERTEX_LIGHT_SHADER false
#define USE_FRAGMENT_LIGHT_SHADER false

#define GEOMETRY_INPUT_TYPE GL_TRIANGLES         // irrilevante
#define GEOMETRY_OUTPUT_TYPE GL_TRIANGLE_STRIP   // irrilevante
#define GEOMETRY_MAX_VERTICES 3                  // irrilevante

#define ENABLE_BACK_FACE_CULLING true
#define LOAD_NORMALS true
#define TIMER_MS 0

Risultato:

Risultato fragment shader semplice

Copyright © 2011 Riccardo Monica
Eccetto ove espressamente indicato altrimenti, il contenuto di questa pagina è disponibile secondo la licenza Creative Commons Attribuzione - Condividi allo stesso modo 3.0.