2010-08-27 11 views
7

Mentre stavo leggendo RedBook sono rimasto abbastanza confuso, che openGL può avere un massimo di 8 luci in scena (numero a seconda dell'implementazione, ma dovrebbe essere intorno a 8).Limite luci OpenGL

Ma posso immaginare il numero di situazioni che avrebbero bisogno di più luci, quindi penso che ci sia un trucco intorno a questo in game dev.

Ad esempio, si dispone di una strada molto lunga con 50 luci, o si può avere una squadra di 20 persone che utilizzano tutte le torce. Come simuli in realtà queste situazioni? C'è un problema, quella luce illumina solo la parte della mesh, non l'intero cono tra sorgente e oggetto, quindi se non abbiamo aria pulita al 100%, ci deve essere anche una sorta di simulazione. Com'è fatto, e il gioco gira liscio? (Ho letto anche che abilitare tutte le 8 luci potrebbe uccidere FPS)

risposta

10

8 luci è la limitazione della pipeline GL fissa, in cui si abilitano ciascuno di essi, la modalità di impostazione, i parametri, ecc. Ora si dispone di pixel shader e l'illuminazione viene eseguita all'interno dello shader. Qui puoi utilizzare un gran numero di spie dinamiche (non in trame). Devi solo fornire sufficientemente tutti i parametri di queste luci (magari, in una texture) e testare quante luci lo shader è in grado di elaborare. Inoltre, nello shader puoi eliminare le luci troppo deboli (contribuendo troppo poco al valore del pixel) o solo troppo lontane.

Aggiornamento: shader complesso con ramificazione può anche generare luci (si pensi alla lunga strada o all'albero di Natale). Potrebbe essere più efficiente di fornire un numero elevato di parametri.

+0

aggiornamento: questa tecnica è stata discussa molto, ecco un collegamento: http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showflat&Number=267432 – alxx

+0

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

+0

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

4

Uno dei trucchi che verranno utilizzati nei giochi è simulare la luce con una trama.

Quindi, nell'esempio di illuminazione stradale, le aree "illuminate" saranno in realtà un'immagine di una trama più luminosa. Solo le luci più vicine saranno fonti di luce per ottenere gli effetti corretti.

Ci sono approcci simili in cui le trame semitrasparenti o le trame con un cono trasparente sono sovrapposte alla scena per dare lo stesso effetto.

Non dimenticare che calcolare le ombre, ecc. In tempo reale significa che la scena deve essere resa dal punto di vista della luce per calcolare l'intensità della luce in qualsiasi posizione. Quindi per 8 luci stai rendendo la scena (o parti della scena) fino a 8 volte prima del che effettivamente rende la scena per la visualizzazione. Anche se questo viene fatto sulla GPU piuttosto che sulla CPU, è molto costoso.

5

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.

Problemi correlati