2012-02-20 10 views
6

Sto scrivendo un gioco OpenGL ES 2.0 (su iOS). Come posso creare uno shader (poiché presumo che sarebbe più semplice farlo in uno shader) in modo che la geometria più lontana dall'origine (sull'asse Z) appaia più scura?Come posso colorare le cose in OpenGL ES 2.0 in base alla loro profondità?

L'acqua in questa immagine illustra l'effetto che ho in mente

Zarch http://www.bytecellar.com/wp-content/uploads/2010/12/Zarch_screen.png

+0

Probabilmente dovresti cercare l'illuminazione Open GL ES 2.0. – Lordalcol

risposta

8

Questo è abbastanza semplice da fare se si desidera utilizzare la posizione Z della geometria. Si potrebbe avere un vertex shader come il seguente:

attribute vec4 position; 

varying float zDepth; 

uniform mat4 modelViewProjMatrix; 

void main() 
{ 
    vec4 newPosition = modelViewProjMatrix * position; 
    gl_Position = newPosition; 
    zDepth = (2.0 - (1.0 + newPosition.z))/2.0; 
} 

e uno shader frammento come

varying highp float zDepth; 

void main() 
{ 
    gl_FragColor = vec4(zDepth, zDepth, 0.0, 1.0); 
} 

che produrrebbe il seguente aspetto:

Depth-shaded OpenGL teapot

ho un esempio di questo all'interno di this iPad sample code ho assemblato per la mia classe OpenGL ES 2.0.

+0

Funziona bene, specialmente se si incorpora il colore degli oggetti. Il "2.0" nel codice deve essere modificato in qualunque sia la tua profondità. – Piku

0

Ho fatto un test piuttosto interessante con ciò che @brad fornisce. Ho appena cambiato la riga:

gl_FragColor = vec4(1.0, 1.0, 0.0, zDepth); 

Non succede nulla alfa. Sono io o c'è qualcos'altro che manca allo Alpha?

+0

O la maggior parte dei tuoi valori di profondità sono davvero vicini a uno, oppure GL_BLEND è disabilitato, così come glBlendFunc non è impostato. –

Problemi correlati