Parker Kemp
Parker Kemp

Reputation: 765

How to draw point sprites of different sizes in OpenGL?

I'm making a small OpenGL Mac app that uses point sprites. I'm using a vertex array to draw them, and I want to use a similar "array" function to give them all different sizes.

In OpenGL ES, there is a client state called GL_POINT_SIZE_ARRAY_OES, and a corresponding function glPointSizePointerOES() which do exactly what I want, but I can't seem to find an equivalent in standard OpenGL.

Does OpenGL support this in any way?

Upvotes: 3

Views: 1918

Answers (3)

Nicol Bolas
Nicol Bolas

Reputation: 473447

If by "Does OpenGL support this", you mean "Can I do something like that in OpenGL", absolutely.

Use shaders. Pass a 1-dimensional generic vertex attribute that represents your point size. And in your vertex shader, set that point size as the gl_PointSize output from the vertex shader. It's really quite simple.

If you meant, "Does fixed-function OpenGL support this," no.

Upvotes: 2

Hugh Fisher
Hugh Fisher

Reputation: 2516

To expand a little on Fen's answer, the fixed function OpenGL pipeline can't do exactly what you want. It can do 'perspective' points which get smaller as the Z distance increases, but that's all.

For arbitrary point size at each vertex you need a custom vertex shader to set the size for each. Pass the point sizes either as an attribute array (re-use surface normals or tex coords, or use your own attribute index) or in a texture map, say a 1D texture with width equal to size of points array. The shader code example referred to by Fen uses the texture map technique.

Upvotes: 2

fen
fen

Reputation: 10115

OpenGL does not support this Apple extension, but you can do it other other way:

For fixed pipeline: (opengl 1.4 and above)

You need to setup point parameters:

float attenuation[3] = {0.0f, 1.0f, 0.0f};    
glPointParameterfvEXT(GL_POINT_DISTANCE_ATTENUATION, attenuation);

glPointParameterfEXT(GL_POINT_SIZE_MIN, 1.0f);
glPointParameterfEXT(GL_POINT_SIZE_MAX, 128.0f);

glEnable(GL_POINT_SPRITE);

OpenGL will calculate point size for you that way

Shaders

Here is some info for rendering using shaders: http://en.wikibooks.org/wiki/OpenGL_Programming/Scientific_OpenGL_Tutorial_01

Upvotes: 2

Related Questions