Vertex Shader è una fase programmabile del pipeline grafico che elabora ogni vertice di un modello 3D in modo indipendente. Secondo Khronos Group, 2025, lo shader di vertici riceve in input gli attributi dei vertici — coordinate, normali, colore e coordinate di texture — e li trasforma secondo la logica definita. Vertex Shader viene eseguito per ogni vertice indipendentemente, consentendo di parallelizzare efficientemente i calcoli su migliaia di core GPU.
Punti chiave
Vertex Shader è una fase programmabile del pipeline grafico che elabora ogni vertice di un modello 3D individualmente. Un vertice è un punto nello spazio tridimensionale contenente attributi: coordinate xyz, normali, colore e coordinate di texture UV.
A differenza del pipeline a funzione fissa (fixed-function pipeline) dove le trasformazioni venivano eseguite secondo un algoritmo rigido, Vertex Shader dà allo sviluppatore il controllo completo sulla trasformazione dei vertici. Ciò consente di implementare animazione procedurale, deformazione di modelli, skinning scheletrico e qualsiasi trasformazione matematica lato GPU.
Il pipeline grafico OpenGL ES include una sequenza di fasi dai dati di input all'immagine finale. Vertex Shader si trova dopo la fase di assemblaggio dei vertici e prima della fase di rasterizzazione. Ogni vertice inviato dalla CPU attraverso un buffer di vertici passa attraverso Vertex Shader esattamente una volta, e il risultato viene inoltrato alla fase successiva per l'assemblaggio delle primitive.
| Fase del pipeline | Scopo |
|---|---|
| Vertex Specification | Trasferimento di dati e attributi dei vertici dal VBO |
| Vertex Shader | Elaborazione di ogni vertice, trasformazione delle coordinate |
| Tessellation | Suddvisione opzionale della geometria in sotto-primitive |
| Geometry Shader | Generazione o rimozione opzionale di primitive |
| Rasterization | Conversione di primitive in frammenti per il riempimento |
Vertex Shader riceve gli attributi dei vertici dal buffer di vertici (VBO) attraverso puntatori di attributi di vertice configurati nel codice CPU. Lo sviluppatore scrive il codice dello shader in GLSL (OpenGL Shading Language) o un linguaggio equivalente, che il driver della GPU compila in istruzioni macchina per il chip specifico.
Per ogni vertice, Vertex Shader esegue sequenzialmente tre operazioni: lettura degli attributi di input — applicazione delle trasformazioni definite dallo sviluppatore — scrittura dei risultati in variabili di output. L'output minimo richiesto è la posizione del vertice nello spazio di clipping (gl_Position). Tutti gli altri dati di output (colore, normali, coordinate di texture) vengono interpolati e passati alla fase successiva — Fragment Shader.
#version 300 es
in vec3 aPosition;
in vec2 aTexCoord;
uniform mat4 uMVP;
out vec2 vTexCoord;
void main() {
gl_Position = uMVP * vec4(aPosition, 1.0);
vTexCoord = aTexCoord;
}
Vertex Shader risolve un'ampia gamma di compiti del pipeline grafico relativi alla trasformazione della geometria. Ogni compito viene implementato tramite operazioni matematiche su vettori e matrici, eseguite in parallelo per migliaia di vertici simultaneamente.
Il compito base e più comune è moltiplicare le coordinate dei vertici per le matrici model, view e projection (MVP). La matrice MVP trasforma un vertice dallo spazio locale del modello allo spazio di clipping (clip space), che viene poi normalizzato e convertito in coordinate dello schermo nelle fasi automatiche del pipeline.
Per i personaggi animati, Vertex Shader implementa l'animazione scheletrica (skinning). Ogni vertice è legato a più ossa con pesi specifici. Vertex blending — una somma ponderata delle trasformazioni delle ossa legate — consente di deformare uniformemente la pelle del personaggio quando lo scheletro si muove.
Vertex Shader può modificare la geometria in base al tempo o ad altri parametri uniform senza coinvolgimento della CPU. Wave deformation, spostamento per rumore Perlin ed effetti di increspatura dell'acqua — tutti questi effetti vengono implementati nello shader di vertici senza ricaricare la geometria dalla RAM.
Sebbene entrambi i tipi di shader siano fasi programmabili del pipeline grafico, Vertex Shader e Fragment Shader risolvono compiti fondamentalmente diversi e operano in fasi diverse dell'elaborazione dell'immagine.
| Caratteristica | Vertex Shader | Fragment Shader |
|---|---|---|
| Dati di input | Attributi dei vertici dal VBO | Dati interpolati dal VS |
| Numero di chiamate | Numero di vertici | Numero di frammenti |
| Compito principale | Trasformazione della geometria | Calcolo del colore del pixel |
| Carico computazionale | Complessità della geometria | Risoluzione dello schermo |
| Accesso alle texture | Limitato (tramite texture lookup) | Accesso completo |
La differenza chiave è la frequenza di chiamata. Vertex Shader viene chiamato una volta per vertice, mentre Fragment Shader viene chiamato per ogni frammento (pixel). In una scena ad alta risoluzione, il numero di chiamate di Fragment Shader supera il numero di chiamate di Vertex Shader di migliaia di volte, rendendo l'ottimizzazione degli shader di pixel ancora più critica.
Le prestazioni di Vertex Shader sono criticamente importanti per le applicazioni in tempo reale, specialmente nello sviluppo mobile con consumo energetico limitato. I principali fattori di prestazione sono il numero di vertici, la complessità del codice dello shader e la larghezza di banda della memoria GPU.
Per ridurre il carico su Vertex Shader, vengono utilizzati i seguenti approcci. Level of Detail (LOD) — passaggio a versioni semplificate dei modelli quando la telecamera si allontana dall'oggetto. Instancing — disegno ripetuto della stessa geometria con diverse matrici di trasformazione in un'unica chiamata di disegno (draw call).
// Vertex Shader con supporto instancing
in vec3 aPosition;
in mat4 aInstanceMatrix;
uniform mat4 uViewProjection;
void main() {
vec4 worldPos = aInstanceMatrix * vec4(aPosition, 1.0);
gl_Position = uViewProjection * worldPos;
}
Vertex Shader su diverse API grafiche ha logica simile, ma sintassi e convenzioni di denominazione diverse. Esaminiamo l'implementazione di uno shader di vertici di base in GLSL per OpenGL ES 3.0 e in Metal Shading Language per iOS e macOS.
#version 300 es
in vec4 position;
in vec3 normal;
in vec2 texcoord;
uniform mat4 modelViewMatrix;
uniform mat4 projectionMatrix;
uniform mat3 normalMatrix;
out vec3 vNormal;
out vec2 vTexCoord;
out vec3 vPosition;
void main() {
vec4 mvPosition = modelViewMatrix * position;
vPosition = mvPosition.xyz;
vNormal = normalMatrix * normal;
vTexCoord = texcoord;
gl_Position = projectionMatrix * mvPosition;
}
#include <metal_stdlib>
using namespace metal;
struct VertexIn {
float3 position [[attribute(0)]];
float3 normal [[attribute(1)]];
};
struct VertexOut {
float4 position [[position]];
float3 worldNormal;
};
vertex VertexOut
vertexMain(VertexIn in [[stage_in]],
constant float4x4& mvp [[buffer(1)]]) {
VertexOut out;
out.position = mvp * float4(in.position, 1.0);
out.worldNormal = in.normal;
return out;
}
Domande frequenti
Vertex Shader è un programma sulla GPU che elabora ogni vertice di un modello 3D e trasforma le sue coordinate in coordinate dello schermo. Immagina un modello come una rete di punti; lo shader di vertici sposta questi punti secondo regole matematiche definite.
Vertex Shader elabora i vertici e si occupa della geometria, mentre Fragment Shader determina il colore di ogni pixel. Il primo viene chiamato per ogni vertice (migliaia), il secondo per ogni pixel (milioni).
Vertex Shader si scrive in un linguaggio corrispondente all'API grafica: GLSL per OpenGL ES, Metal Shading Language per Metal API su iOS/macOS, HLSL per Direct3D. Concettualmente, tutti eseguono le stesse operazioni sui vertici.
La complessità dello shader di vertici influisce direttamente sugli FPS: più istruzioni per vertice = maggiore tempo di elaborazione. L'ottimizzazione include la riduzione del numero di vertici tramite LOD, l'uso di instancing e la minimizzazione delle ramificazioni condizionali nel codice dello shader.
Compiti principali nei giochi: trasformazione delle coordinate tramite matrici MVP, skinning di personaggi animati, deformazione procedurale di vestiti e capelli, morphing tra espressioni facciali ed effetti particellari con animazione sulla GPU.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche