2010-08-16 6 views
8

J'essaie d'implémenter des points texturés (par exemple des sprites ponctuels) dans OpenGL ES 2.0 pour un système de particules. Le problème que je rencontre est que les points sont tous rendus sous la forme de carrés noirs pleins, plutôt que d'avoir la texture correctement mappée.Points texturés dans OpenGL ES 2.0?

J'ai vérifié que gl_PointCoord renvoyait en fait des valeurs x/y de 0.0 à 1.0, qui seraient mappées sur toute la texture. L'appel de texture2D semble toujours revenir en noir.

Mon vertex shader:

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

Et mon fragment shader:

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 texture en question est 16x16. Je suis capable de mapper avec succès cette texture à une autre géométrie, mais pour une raison quelconque, pas aux points.

Ma plate-forme est un Motorola Droid, sous Android 2.2.

+0

Mépris, j'ai eu un problème avec ma routine de chargement de texture. Fonctionne bien maintenant. – Ivan

+1

Vous auriez pu dire quel était le problème, et comment vous l'avez résolu ... –

+0

Était-ce juste le chargement de la texture? Comment allez-vous le passer au shader? À votre santé – DiogoNeves

Répondre

14

Vous sélectionnez votre texture comme active et la liez - comme d'habitude. Mais vous devez passer votre unité de texture comme uniforme au programme de shader. Vous pouvez donc utiliser le gl_PointCoord comme coordonnées de texture dans votre fragment shader.

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

Et votre fragment shader devrait ressembler à:

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