GL_ARB_point_parameters and GL_ARB_point_sprite extensions.

 

1: Introduction.

 

In Basic particle systems we use quad to render geometry. This is very expensive for each particle to billboard the face and after send 4 points and 4 textures coordinate to video cards. The GL_ARB_point_parameters and GL_ARB_point_sprite give us a fast and easy way for rendering particles. These extensions allow us to use points rather than quads.

 

2: Set up extension.

 

The first think to do is to check if your video card supports one of the two extensions. After that step we get de functions pointer.

 

In your header file

0

1

2

3

4

 

 

bool m_PointARBEnable;

bool m_PointNVEnable;

PFNGLPOINTPARAMETERFARBPROC  glPointParameterfARB  ;

PFNGLPOINTPARAMETERFVARBPROC glPointParameterfvARB ;

void CheckForExtension(void);

 

 

0: A Boolean used later to check if Point ARB is available.

1: A Boolean used later to check if Point NV is available.

2,3: Functions pointer for extensions.

 

In your cpp file

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

 

void CheckForExtension(void)

{

      char *ext = (char*)glGetString( GL_EXTENSIONS );

      /////////////////////////////////////////////////////////////////

      //Looking for GL_ARB_point_parameters extension

      /////////////////////////////////////////////////////////////////

      if( strstr( ext, "GL_ARB_point_parameters" ) != NULL )

      {

            glPointParameterfARB  = (PFNGLPOINTPARAMETERFEXTPROC)wglGetProcAddress("glPointParameterfARB");

            glPointParameterfvARB = (PFNGLPOINTPARAMETERFVEXTPROC)wglGetProcAddress("glPointParameterfvARB");

            if( !glPointParameterfARB || !glPointParameterfvARB )

            {

                  LOGFILE<<"One or more GL_EXT_point_parameters functions were not found"<<std::endl;

                  m_PointARBEnable=false;

            }

            m_PointARBEnable=true;

      }

}

 

 

2: Use a char* to store the list of extension available on video cards.

6: Check if we find the string "GL_ARB_point_parameters" in the extension list.

8, 9: Get the pointer for glPointParameterfARB and glPointParameterfvARB function.

10-16: Check if success and set Boolean state.

 

3: New functions and constants descriptions.

  

A: glPointParameterfARB and glPointParameterfvARB.

 

These functions are used to set points parameters.

glPointParameterf[v]ARB(Glenum pname,GLfloat param);

 

The variable pname can take 4 values. Each of these values is constant and defined in “glext.h”.

 

GL_POINT_SIZE_MIN_ARB: The param parameter is used to specify the minimum point size.

The default value is 0.0

Be careful don’t set minimum size to a value greater than the maximum size.

 

GL_POINT_SIZE_MAX_ARB: The param parameter is used to specify the maximum point size.

The default value is the largest point size supported by the implementation.

Be careful don’t set minimum size to a value greater than the maximum size.

 

GL_POINT_FADE_THRESHOLD_ARB: The param parameter is used to specify the point size for which smaller

Points fade out instead of shrinking when multisampling is enabled.

The default value is 1.0f.

 

GL_POINT_DISTANCE_ATTENUATION_ARB: The param parameter is used to specify the coefficients used in

the distance attenuation function for point size.

The default array value is 0,0,0.

 

B: new constant for Point Parameter.

 

There is 2 new constant GL_POINT_SPRITE_ARB and GL_COORD_REPLACE_ARB.

We use GL_POINT_SPRITE_ARB and GL_COORD_REPLACE_ARB to center texture on vertex.

 

glTexEnvf (GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE);  

 

We enable point parameter by calling this function.

 

glEnable (GL_POINT_SPRITE_ARB);

 

4:Exemple draw a particle.

 

VecParticle is an array of particle.

 

0

1

2

3

4

5

6

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

 

void DrawARBPointSprites(Particle* VecParticle, int Number)

{

      float quadratic[] =  { 0.0f, 0.0f, 0.01f };

      glPointParameterfvARB( GL_POINT_DISTANCE_ATTENUATION_ARB, quadratic );

      float maxSize = 0.0f;

      glGetFloatv( GL_POINT_SIZE_MAX_ARB, &maxSize );

      glPointSize( maxSize );

      glPointParameterfARB( GL_POINT_SIZE_MAX_ARB, maxSize );

      glPointParameterfARB( GL_POINT_SIZE_MIN_ARB, 1.0f );

      glTexEnvf( GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE );

      glEnable( GL_POINT_SPRITE_ARB );

      glBegin( GL_POINTS );

      {

            for(int i=0;i<Number;i++)

            {

                  glColor4f(VecParticle[i].Color.x,VecParticle[i].Color.y,VecParticle[i].Color.z,1.0f);

                  glVertex3f(VecParticle[i].Position.x,VecParticle[i].Position.y,VecParticle[i].Position.z);

            }

      }

      glEnd();

      glDisable( GL_POINT_SPRITE_ARB );

}

 

2-3: declare and pass value for distance attenuation.

4-8: Get the maximum point size available and apply it.

9: Set the minimum point size.

10: Tell openGL to center texture on vertex.

11: Enable point rendering.

12-20: Draw all particles in array.

21: Disable point sprite.

 

For questions or comments see our forum section.

 

Source:tutorialARB.zip

 

Hermanns Christophe Data.

 

References:

 

The OpenGL Extensions guide. By Eric Lengyel.

Charles rivers Media

ISBN: 1-58450-294-0

 

OpenGl 1.2 guide

Campus Press

ISBN: 2-7440-0841-9