L'illuminazione è un argomento molto complesso in computer grafica.
Ciò che importa è, naturalmente, l'illuminazione dell'oggetto, emulando l'illuminazione del mondo reale o l'effetto che stiamo prendendo di mira. L'ambiente di illuminazione potrebbe essere composto da molte fonti al fine di approssimare l'effetto reale che stiamo cercando di ottenere.
Le implementazioni di illuminazione OpenGL sono luci dinamiche, che sono l'astrazione del punto di luce che consente di "illuminare" (ovvero dare un colore) ai vertici renderizzati (che sono usati per i triangoli di rendering). ... il vertice è illuminato, ottieni un contributo cromatico per ogni luce.
Come hai detto, il processo di rendering richiede più tempo più luci che abbiamo abilitato. Per minimizzare questo, hai diverse possibilità.
- abbattimento leggera (escluse luci che contributo è piccolo per cambiare il colore), e questo è determinato utilizzando le proprietà della luce (distanza, cono, attenuazione, punti di vista e oggetti ostruiscono).
- Illuminazione statica, che utilizza trame per emulare luci su oggetti che non si spostano mai.
L'illuminazione fissa di OpenGL contribuisce al colore del vertice, che viene interpolato con altri colori dei vertici per rasterizzare il triangolo. Nel caso in cui la geometria sia composta da pochi triangoli, non è possibile vedere alcun cono di luce all'interno di ciascun triangolo, poiché il colore del suo frammento è il risultato dell'interpolazione di tre colori (i tre vertici).
Per ottenere un'illuminazione più precisa, il software determina ciascun colore (pixel) del frammento nello stesso modo in cui un vertice viene colorato dalle luci, ma come puoi capire, potrebbero esserci più pixel dei vertici. Un approccio consiste nel calcolare (utilizzando shader o un'estensione OpenGL) il contributo della luce per ciascun pixel della geometria durante la fase di rasterizzazione, o determinare il colore dei pixel utilizzando l'illuminazione differita.
L'illuminazione differita utilizza trame multiple (corrispondenti al viewport) per memorizzare i parametri delle luci per ciascun pixel visualizzato. In questo modo si esegue il calcolo della luce dopo la produzione dell'immagine, determinando il contributo della luce pixel una volta per ogni pixel, invece di una volta per ogni pixel della geometria.
aggiornamento: questa tecnica è stata discussa molto, ecco un collegamento: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=267432 – alxx
Le luci deboli non sono una caratteristica degli ombreggiatori, dal momento che il la possibilità di abilitare/disabilitare le luci potrebbe essere eseguita al di fuori della pipeline fissa progettando un gestore luci, consentendo solo luci importanti. – Luca
Il gestore luci abilita/disabilita le luci per l'intera scena. Lo shader dei pixel potrebbe farlo per pixel, vedere la differenza? A proposito, 8 luci nella pipeline tradizionale sono per-vertice, mentre lo shader fa l'illuminazione per-pixel - una cosa completamente diversa. – alxx