10

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.

genpfault
  • 51,148
  • 11
  • 85
  • 139
Ivan
  • 177
  • 1
  • 3
  • 7

2 Answers2

15

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);
}
Peter O.
  • 32,158
  • 14
  • 82
  • 96
Constantin
  • 8,721
  • 13
  • 75
  • 126
0

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.

SparkyNZ
  • 6,266
  • 7
  • 39
  • 80