3

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?

4

3 回答 3

2

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

于 2013-03-30T08:29:19.510 回答
2

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.

于 2013-03-30T09:29:38.003 回答
2

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.

于 2013-03-30T10:22:17.130 回答