2010-08-16 20 views
8

Estoy tratando de implementar puntos texturizados (por ejemplo, sprites puntuales) en OpenGL ES 2.0 para un sistema de partículas. El problema que estoy teniendo es que todos los puntos se representan como cuadrados negros sólidos, en lugar de tener la textura correctamente mapeada.Puntos texturizados en OpenGL ES 2.0?

He verificado que gl_PointCoord está devolviendo valores de x/y de 0.0 a 1.0, que se correlacionarían con toda la textura. La llamada texture2D siempre parece volver negra.

Mi sombreado de vértices:

attribute vec4 aPosition; 
attribute float aAlpha; 
attribute float aSize; 
varying float vAlpha; 
uniform mat4 uMVPMatrix; 

void main() { 
    gl_PointSize = aSize; 
    vAlpha = aAlpha; 
    gl_Position = uMVPMatrix * aPosition; 
} 

Y mi fragmento de sombreado:

precision mediump float; 
uniform sampler2D tex; 
varying float vAlpha; 

void main() { 
    vec4 texColor = texture2D(tex, gl_PointCoord); 
    gl_FragColor = vec4(texColor.rgb, texColor.a * vAlpha); 
} 

La textura en cuestión es de 16x16. Puedo mapear con éxito esta textura a otra geometría, pero por alguna razón no a puntos.

Mi plataforma es un Motorola Droid, con Android 2.2.

+0

Indiferencia, tuve un problema con mi rutina de la textura de la carga. Funciona muy bien ahora. – Ivan

+1

Podría haber dicho cuál era el problema y cómo lo resolvió ... –

+0

¿Fue solo la carga de la textura? ¿Cómo lo pasas al sombreador? Aclamaciones – DiogoNeves

Respuesta

14

Selecciona la textura como activa y únela, como normalmente. Pero debe pasar su unidad de textura como uniforme al programa de sombreado. Entonces puede usar gl_PointCoord como coordenadas de textura en su sombreador de fragmentos.

glUniform1i(MY_TEXTURE_UNIFORM_LOCATION, 0); 
glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, yourTextureId); 
glEnable(GL_TEXTURE_2D); 
glDrawArrays(GL_POINTS, 0, pointCount); 
glDisable(GL_TEXTURE_2D); 

Y el fragment shader debe verse como:

uniform sampler2D texture; 
void main () 
{ 
    gl_FragColor = texture2D(texture, gl_PointCoord); 
}