Programma di esempio

Per provare gli shader che seguono è stato sviluppato un piccolo programma esemplificativo, che si limita a caricare uno shader e a visualizzare con esso un icosaedro in una finestra di GLUT.

Download

Il programma di esempio è disponibile secondo la licenza "licenza Creative Commons Attribuzione - Condividi allo stesso modo 3.0" oppure la "GNU General Public License versione 3".

Il programma è scritto in C++ e può essere compilato sia su sistemi basati su linux (tramite Makefile) o su windows (soluzione Visual Studio 2005). Può essere eseguito solo su schede video che supportano OpenGL 2.1 o superiore e l'estensione GL_EXT_geometry_shader4.
Dipende dalle librerie:

Il programma si compone di tre file sorgenti. Per semplicità, il primo file include direttamente gli altri due per compilarli in un unico passaggio senza usare header o file oggetto.

All'interno della cartella "shaders" sono riportate copie di tutti gli shader usati nella sezione GLSL 1.20, raggruppati in sottocartelle. Questi shader hanno nomi convenzionali:

Siccome questi shader sono introdotti progressivamente nella guida a GLSL, non tutti i file sono sempre presenti. Perciò, nella prima parte del file "shader.cpp" ci sono alcuni define che permettono di cambiare facilmente gli shader che sono caricati. È comunque necessario ricompilare affinché le modifiche divengano effettive.

#define SHADER_FOLDER "shaders/subfolder/"  // il percorso (relativo) che contiene gli shader

#define USE_VERTEX_SHADER true              // se è vera, vertex.txt è caricato
#define USE_FRAGMENT_SHADER true            // se è vera, fragment.txt è caricato
#define USE_GEOMETRY_SHADER false           // se è vera, geometry.txt è caricato
#define USE_NORMAL_SHADER false             // se è vera, FaceNormal.txt è caricato come geometry shader
#define USE_VERTEX_LIGHT_SHADER false       // se è vera, ApplyLight.txt è caricato come vertex shader
#define USE_FRAGMENT_LIGHT_SHADER true      // se è vera, ApplyLight.txt è caricato come fragment shader
#define USE_TESSEVAL_LIGHT_SHADER false     // se è vera, ApplyLight.txt è caricato come tessellation evaluation shader
#define USE_TESSELLATION_SHADERS false      // se è vera, tesseval.txt e tesscontrol.txt sono caricati

Altre opzioni riguardano la configurazione del geometry shader. Vedere la sezione Geometry Shader per la spiegazione.

#define GEOMETRY_INPUT_TYPE GL_TRIANGLES                 // tipo di primitiva in ingresso al geometry shader
#define GEOMETRY_OUTPUT_TYPE GL_TRIANGLE_STRIP           // tipo di primitiva prodotta dal geometry shader
#define GEOMETRY_MAX_VERTICES 3                          // massimo numero di vertici prodotti dal geometry shader

Infine, ci sono altre opzioni che possono essere utili per qualche esperimento:

#define ENABLE_BACK_FACE_CULLING true       // controlla se GL_CULL_FACE è abilitato o disabilitato
#define LOAD_NORMALS true                   // se è vero, le normali della primitiva sono caricate (nella variabile predefinita gl_Normal)
#define TIMER_MS 0                          // se diverso da 0, incrementa la variabile uniform "time" e ridisegna la scena ogni TIMER_MS ms

Al termine di ogni esempio di shader, nelle sezioni successive, viene presentato un prospetto che contiene uno dei valori che queste constanti possono contenere per eseguire correttamente quell'esempio.
L'unica variabile che non può essere prevista è il define SHADER_FOLDER, che dipende dal percorso degli shader relativo alla directory di lavoro e può cambiare a seconda dell'installazione.

Il programma inizializza, se esistono, le seguenti variabili uniform e attribute all'interno degli shader. Esse sono usate negli esempi successivi.

uniform vec3 light1position;          // la posizione della luce
uniform vec3 light1diffuse;           // la componente diffusiva della luce
uniform vec3 light1specular;          // la componente speculare della luce
uniform vec3 light1ambient;           // la componente ambientale della luce
uniform sampler3D random3d;           // una texture tridimensionale casuale
uniform int time;                     // numero progressivo proporzionale al tempo
uniform vec2 initC;                   // valore iniziale di C per il frattale
uniform int numIter;                  // numero massimo di iterazioni per il frattale
attribute float matshininess;         // la shininess del materiale
attribute vec3 matspecular;           // la componente speculare del materiale

Se sono attivi i tessellation shader, inoltre, altre variabili sono caricate:

uniform float tesslevelinner;         // per gl_TessLevelInner, valori interi
uniform float tesslevelouter;         // per gl_TessLevelOuter, valori interi
uniform mat4 projectionmatrix;        // matrice di proiezione
uniform mat4 modelviewmatrix;         // matrice di modelview
in vec3 positionattrib;               // posizione del vertice
in vec3 normalattrib;                 // normale del vertice
in vec4 colorattrib;                  // colore del vertice

Durante l'esecuzione del programma possono essere usati i seguenti tasti funzione:


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.