2012-03-07 18 views
12

Ho una scena OpenGL resa con un gruppo di sprite e mi piacerebbe aggiungere automaticamente le ombre su tutte. Ecco una foto che mostra quello che voglio dire:Ombreggiature OpenGL ES per sprite 2D

enter image description here

La scena utilizza proiezione ortogonale, gli sprite sono quad texture, e sto usando il depth buffer di disegnarli anteriore a quella posteriore. Sto lavorando con OpenGL ES 2.0, ma anche i pensieri dei mondi iOS o non ES potrebbero essere apprezzati. Ho gettato alcune idee in giro su come posso fare questo, e mi piacerebbe scoprire quale è la più promettente.

  1. Draw ogni sprite due volte, la prima normalmente, la seconda con un qualche tipo di ombra Shader un po 'più profondo nella scena. Non sono sicuro se questo è possibile?
  2. Disegna uno sprite, quindi disegna di nuovo, si oscura e con qualche alfa, più volte con un jitter casuale applicato alle vertici. Questo può sembrare sciocco e non è affatto un'ombra.
  3. Disegna la scena di base senza sfondo su una trama, quindi sfoca e scurisce per creare una grande ombra esterna. Quindi disegna la scena di base sulla texture dell'ombra esterna e infine sullo sfondo. Questo perderà l'ombra tra gli sprite, comunque.
  4. SSAO in una passata post-elaborazione. Potrebbe essere il più dinamico e automatico, ma potrebbe sembrare sfocato/sgranato e molto lento.
  5. Al momento della creazione, generare una trama ombra per ogni sprite. Per il rendering, disegna uno sprite e quindi il suo ombreggiatura texuture un po 'più in profondità nella scena. Penso che mi piacerebbe evitarlo a causa del tempo di caricamento e dei requisiti di memoria extra, ma questo potrebbe essere il più veloce e il migliore?

Non voglio eseguire alcun lavoro con ombre con trame esterne, poiché utilizzo le stesse trame di sprite a scale diverse e le ombre pronte al forno si scalerebbero in modo innaturale.

Quindi, qualcuna di queste è migliore delle altre? Ci sono altre opzioni a cui non sto pensando? Grazie!

+0

Per il # 3, potresti essere interessato alle raccomandazioni di Imagination Technologies per la postelaborazione: http://www.imgtec.com/powervr/insider/docs/PowerVR.Post%20Processing%20Effects%20Development%20Recommendations.1.7f. External.pdf, che include una descrizione di un filtro di fioritura ad alta efficienza. Sostituire il loro filtro passa-alto con la semplice interpretazione di versioni scure degli oggetti dovrebbe produrre una buona ombra rapida. –

+0

Buona lettura, Brad. Posso usare questo metodo se vado con # 3. – Josh

risposta

5

Questi sono tutti alcune opzioni ben pensato, qui sono i miei pensieri su ogni

  1. E 'sicuramente possibile utilizzare uno shader, ma potrebbe non essere l'opzione più performante, dal momento che la sfocatura dovrà essere fatto all'interno dello shader e potrebbe coinvolgere più ricerche di texture.
  2. Disegnare la trama più volte potrebbe funzionare e apparirebbe un'ombra, poiché ogni immagine "distorta" avrebbe valori alfa leggermente modificati. Ma ancora una volta, la fusione e il rendering multiplo di ogni sprite si sommano e potrebbero influire sulle prestazioni.
  3. Mi piace e raccomando questa opzione, perché puoi impostare uno shader che metta pixel neri invece di pixel colorati (considerando alfa) in un bersaglio di rendering più piccolo dello schermo (1/4 °?) E quindi usa questo come texture ombra . Poiché la trama viene ora allungata, otterrai anche la "sfocatura" gratuita. Il pixel shader che fa il "blackening" sarebbe molto semplice e non influenzerebbe troppo le prestazioni.
  4. A meno che non sia veramente necessario avere ombre di alta qualità (e il metodo precedente non è sufficiente) non lo consiglierei.
  5. Questa è ovviamente l'opzione più flessibile e ha una complessità di rendering x2. Sfortunatamente, consumerà più memoria di tutte le altre opzioni di cui sopra.

Spero che questo aiuti!

+0

Grazie per i tuoi pensieri! – Josh

+0

Per andare con # 5, sembra che mi otterrà la migliore prestazione. – Josh