Un’ombra Open Graphics Library® (OpenGL®) è un’approssimazione visiva in una scena OpenGL® tridimensionale (3D) di come un’ombra verrebbe proiettata nella vita reale in condizioni di illuminazione simili. Le ombre sono una funzionalità visiva complessa da implementare in OpenGL®, soprattutto perché non esiste un supporto innato per proiettare le ombre in una scena. Esistono invece una varietà di tecniche che possono essere utilizzate per creare ombre dagli oggetti e dalla geometria all’interno di una scena utilizzando vari strumenti, come i vari buffer disponibili, shader e, in alcuni casi, estensioni che danno accesso a funzionalità speciali su determinate grafiche carte. Nella maggior parte dei casi, la qualità, l’accuratezza e la velocità del rendering delle ombre OpenGL® sono direttamente correlate alla potenza di elaborazione e alla memoria dell’hardware grafico presente in un computer o dispositivo. Alcuni dei metodi più popolari di implementazione di un’ombra OpenGL® includono i volumi delle ombre, la mappatura delle ombre e il ray tracing.
La creazione di un’applicazione con supporto shadow OpenGL® richiede conoscenze matematiche e una profonda comprensione di come funziona OpenGL®. OpenGL® è ampiamente utilizzato per creare scene 3D dinamiche e renderizzate in tempo reale, quindi gli algoritmi utilizzati per creare le ombre non devono solo essere ottimizzati per la velocità, ma devono anche essere misurati attentamente per il loro consumo di risorse e le eventuali interruzioni che potrebbe essere causato nella pipeline grafica utilizzata per il rendering. Per questi motivi, il metodo più elementare per creare un’ombra, chiamato ray tracing, spesso non è pratico per le scene 3D complete, perché può richiedere molto tempo.
Il ray tracing segue fondamentalmente una linea immaginaria, o raggio, dal piano di visualizzazione o dalla posizione della telecamera attraverso una scena fino alla superficie di un oggetto e quindi calcola il colore della superficie in base alla posizione di una o più sorgenti luminose e altri fattori. Durante il processo di rasterizzazione, in cui la scena 3D viene disegnata su una superficie bidimensionale (2D) in modo che possa essere visualizzata, il processo di ray tracing deve essere eseguito su ogni pixel che viene disegnato e, soprattutto con trame o altro proprietà della superficie, potrebbe essere necessario valutare più volte gli stessi pixel. Ciò significa che il ray tracing in tempo reale, anche se renderebbe accuratamente le ombre, di solito non è pratico.
Un altro metodo che può essere utilizzato per creare un’ombra OpenGL® è noto come mappatura delle ombre. Questo metodo utilizza il buffer di profondità o stencil per eseguire il rendering di una scena dall’angolo della sorgente luminosa come una serie di distanze dalla sorgente luminosa alle superfici di oggetti diversi all’interno della scena. La scena viene quindi renderizzata una seconda volta dall’angolo di visualizzazione corretto, verificando se ciascun pixel rientra in un determinato intervallo di distanza all’interno del buffer, indicando se il pixel è illuminato o in ombra. L’utilizzo della mappatura delle ombre può richiedere molta memoria e, con scene che hanno più di una fonte di luce, può comportare la creazione di più mappe da più angolazioni.
I volumi shadow sono un modo per creare un’ombra OpenGL® più accurata di altri metodi, ma presenta i suoi problemi. Un volume d’ombra è essenzialmente un pezzo invisibile di geometria in una scena che si espande dalla superficie illuminata di un oggetto lontano dalla fonte di luce. Questo volume può essere confrontato con altri oggetti per vedere se stanno cadendo nell’ombra della superficie da cui ha avuto origine il volume. Questa procedura può essere molto complessa e alla fine creare artefatti visivi quando ottimizzata per la velocità.