2012-02-20 30 views
6

Estoy escribiendo un juego OpenGL ES 2.0 (en iOS). ¿Cómo puedo crear un sombreado (dado que supongo que esto sería más fácil de hacer en un sombreador) para que la geometría más alejada del origen (en el eje Z) aparezca más oscura?¿Cómo puedo colorear cosas en OpenGL ES 2.0 en función de su profundidad?

El agua en esta imagen ilustra el efecto que tengo en mente

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

+0

Probablemente deberías buscar la iluminación Open GL ES 2.0. – Lordalcol

Respuesta

8

Esto es bastante fácil de hacer si lo que desea es utilizar la posición Z de su geometría. Usted podría tener un vertex shader como la siguiente:

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; 
} 

y una fragment shader como

varying highp float zDepth; 

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

que produciría el siguiente aspecto:

Depth-shaded OpenGL teapot

tengo un ejemplo de esto dentro de this iPad sample code que ensamblé para mi clase OpenGL ES 2.0.

+0

Eso funciona bien, especialmente si incorpora el color de los objetos. Sin embargo, el '2.0' en el código necesita cambiar a lo que sea su profundidad z. – Piku

0

Hice una prueba bastante interesante con lo que @brad proporciona. Solo cambio la línea:

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

No pasa nada al alfa. ¿Soy yo o hay algo más que falta en cuanto al Alpha?

+0

La mayoría de sus valores de profundidad son muy similares a uno, o GL_BLEND está deshabilitado, y glBlendFunc no está configurado. –

Cuestiones relacionadas