Un vertex shader è il primo shader all'inizio della pipeline. Esso viene instanziato una volta per ogni singolo vertice in ingresso e non ha alcuna informazione di connessione tra i vertici adiacenti. I vertex shader sono supportati fin da OpenGL 2.0, con l'introduzione del primo linguaggio ad alto livello, GLSL 1.10.
Un vertex shader sostituisce le seguenti funzioni della Fixed Function Pipeline di OpenGL:
Queste funzioni sono disabilitate da OpenGL appena si attiva un program che contiene almeno un vertex shader. Se sono ancora necessarie, devono essere reimplementate nel codice dello shader.
Un vertex shader ha accesso in sola lettura agli attributi del vertice, come variabili globali:
vec4 gl_Vertex; // posizione del vertice (xyzw) da glVertex vec3 gl_Normal; // normale del vertice (xyz) da glNormal vec4 gl_Color; // colore del vertice (rgba) da glColor vec4 gl_MultiTexCoord0; // coordinate delle texture (xyzw), una per ogni texture usata dalla primitiva, fino al massimo 8 (0 - 7)
Il vertex shader ha accesso in scrittura ad altre variabili globali predefinite. Quando il vertex shader termina, queste diventano le nuove proprietà del vertice.
vec4 gl_Position; // nuova posizione del vertice (xyzw) vec4 gl_FrontColor; // colore del vertice per la faccia davanti della primitiva (rgba) vec4 gl_BackColor; // colore del vertice per la faccia dietro della primitiva (rgba) vec4 gl_TexCoord[]; // coordinate delle texture (xyzw)
Come tutti gli shader, un vertex shader ha accesso a molte delle variabili di stato di OpenGL, tra cui le matrici:
mat4 gl_ProjectionMatrix; // matrice di proiezione mat4 gl_ModelViewMatrix; // matrice di modelview mat4 gl_ModelViewProjectionMatrix;// prodotto già precalcolato di gl_ProjectionMatrix * gl_ModelViewMatrix mat3 gl_NormalMatrix; // matrice di trasformazione per le normali, // pari alla parte in alto a sinistra dell'inversa della trasposta di gl_ModelViewMatrix
Questo è un vertex shader che implementa le funzionalità di base, senza l'illuminazione.
#version 120 void main() { gl_FrontColor = gl_Color; gl_BackColor = gl_Color; gl_Position = gl_ModelViewProjectionMatrix * gl_Vertex; }
Il contenuto del listato sovrastante è rilasciato nel pubblico dominio.
La direttiva #version 120 specifica la versione dello standard GLSL che è stata usata per scrivere lo shader (in questo caso, 1.20). È bene specificare la versione all'inizio di ogni shader. Se la direttiva viene omessa, il compilatore considera per default la versione 1.10.
#define SHADER_FOLDER "shaders/simple_vertex/" // o ../shaders/simple_vertex/ o altro percorso relativo #define USE_VERTEX_SHADER true #define USE_FRAGMENT_SHADER false #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:
Si nota che è bastato definire un vertex shader per disabilitare l'illuminazione.
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.