9
votes

I'm trying to implement textured points (e.g. point sprites) in OpenGL ES 2.0 for a particle system. Problem I'm having is the points all render as solid black squares, rather than having the texture properly mapped.

I have verified that gl_PointCoord is in fact returning x/y values from 0.0 to 1.0, which would map across the entire texture. The texture2D call always seems to return black though.

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

And my 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);
}

The texture in question is 16x16. I am able to successfully map this texture to other geometry, but for some reason not to points.

My platform is a Motorola Droid, running Android 2.2.

2
Disregard, I had a problem with my texture loading routine. Works great now.Ivan
You could have said what the problem was, and how you solved it...Nick Bolton
Was it just the loading of the texture? How are you passing it to the shader? CheersDiogoNeves

2 Answers

14
votes

You select your texture as active and bind it - like normally. But you must pass your texture unit as uniform to the shader program. So you can use the gl_PointCoord as texture coordinates in your 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);

And your fragment shader should look like:

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

I also had a similar problem - my sprites were just rendering as coloured squares but no texture was appearing.

I needed to add this:

glEnable( GL_POINT_SPRITE );

Texturing must not be enabled by default on all GPUs.