La comunicazione tra diverse istanze dello stesso shader è impossibile, a causa dell'architettura fortemente parallela della GPU, per cui è non si può sapere in quale ordine gli shader saranno eseguiti.
La comunicazione tra shader diversi allo stesso livello, riuniti nello stesso program, può essere ottenuta facilmente. Da uno shader si può chiamare una funzione definita in un altro shader, se si copia il prototipo della funzione nel primo shader.
Inoltre, variabili globali con lo stesso nome sono in comune tra i vari shader allo stesso livello, per cui anch'esse possono essere usate, oltre ai parametri delle funzioni, per trasmettere e ricevere dati da uno shader.
Si può invece comunicare tra shader collocati in punti diversi della pipeline, appartenenti allo stesso program.
Una regola fondamentale di GLSL impone che ciascuno shader possa inviare dati solamente allo shader immediatamente successivo nella pipeline. Inviare dati da shader successivi (eseguiti dopo) a shader precedenti è ovviamente impossibile. Se il dato deve "scavalcare " uno shader, invece, lo shader intermedio deve avere tra i suoi compiti quello di rilanciare il dato. Si vedrà nella sezione riguardante i Geometry Shader come ciò avviene.
È possibile definire variabili personalizzate comuni sia allo shader precedente che allo shader successivo. In GLSL 1.20, ciò è ottenuto tramite la parola chiave varying. Questo modificatore può essere anteposto alla dichiarazione di una variabile globale.
varying vec3 varyvar;
La variabile deve essere dichiarata in modo identico sia in almeno uno dei vertex shader che in almeno uno dei fragment shader. All'interno del Vertex Shader essa può essere letta e scritta come una qualunque variabile globale. All'interno del fragment shader, invece, la variabile varying è una costante, inizializzata con il valore che vi è stato scritto nel vertex shader.
A ogni vertex shader corrispondono molti fragment shader, perché una sola primitiva può essere rasterizzata in un gran numero di frammenti. Perciò è necessario moltiplicare il dato proveniente dal vertex shader a tutti i fragment shader in modo intelligente.
Ciò è ottenuto attraverso l'interpolazione. L'interpolazione viene eseguita contemporaneamente alla rasterizzazione, perché in realtà il primo attributo di un vertice che deve essere interpolato per ottenere il frammento è la sua posizione.
Come si è già accennato, anche le variabili gl_FrontColor e gl_BackColor sono interpolate per ottenere la variabile di input al fragment shader gl_Color.
Per le variabili personalizzate, però, è possibile definire anche il tipo di interpolazione. Alcuni ulteriori modificatori possono essere aggiunti a varying:
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.