Name

    EXT_point_parameters

Name Strings

    GL_EXT_point_parameters

Version

    Revision Date: September 23, 2010
    Version: 1.8

Number

    54

Dependencies

     SGIS_multisample affects the definition of this extension.

Overview

    This extension supports additional geometric characteristics of points. It
    can be used to render particles or tiny light sources, commonly referred
    as "Light points".

    The raster brightness of a point is a function of the point area, point
    color, point transparency, and the response of the display's electron gun
    and phosphor. The point area and the point transparency are derived from the
    point size, currently provided with the <size> parameter of glPointSize.

    The primary motivation is to allow the size of a point to be affected by
    distance attenuation. When distance attenuation has an effect, the final
    point size decreases as the distance of the point from the eye increases.

    The secondary motivation is a mean to control the mapping from the point
    size to the raster point area and point transparency. This is done in order
    to increase the dynamic range of the raster brightness of points. In other
    words, the alpha component of a point may be decreased (and its transparency
    increased) as its area shrinks below a defined threshold.

    This extension defines a derived point size to be closely related to point
    brightness. The brightness of a point is given by:

                        1
        dist_atten(d) = -------------------
                        a + b * d + c * d^2

        brightness(Pe) = Brightness * dist_atten(|Pe|)

    where 'Pe' is the point in eye coordinates, and 'Brightness' is some initial
    value proportional to the square of the size provided with glPointSize. Here
    we simplify the raster brightness to be a function of the rasterized point
    area and point transparency.

                    brightness(Pe)                      brightness(Pe) >= Threshold_Area
        area(Pe) =
                    Threshold_Area                      Otherwise

        factor(Pe) = brightness(Pe)/Threshold_Area

        alpha(Pe) = Alpha * factor(Pe)

    where 'Alpha' comes with the point color (possibly modified by lighting).

    'Threshold_Area' above is in area units. Thus, it is proportional to the
    square of the threshold provided by the programmer through this extension.

    The new point size derivation method applies to all points, while the
    threshold applies to multisample points only.

Issues

    *   Does point alpha modification affect the current color ?

        No.

    *   Do we need a special function glGetPointParameterfvEXT, or get by with
        glGetFloat ?

        No.

    *   If alpha is 0, then we could toss the point before it reaches the
        fragment stage.

        No.  This can be achieved with enabling the alpha test with reference of
        0 and function of LEQUAL.

    *   Do we need a disable for applying the threshold ? The default threshold
        value is 1.0. It is applied even if the point size is constant.

        If the default threshold is not overriden, the area of multisample
        points with provided constant size of less than 1.0, is mapped to 1.0,
        while the alpha component is modulated accordingly, to compensate for
        the larger area. For multisample points this is not a problem, as there
        are no relevant applications yet. As mentioned above, the threshold does
        not apply to alias or antialias points.

        The alternative is to have a disable of threshold application, and state
        that threshold (if not disabled) applies to non antialias points only
        (that is, alias and multisample points).

        The behavior without an enable/disable looks fine.

    *   Future extensions (to the extension)

        1. GL_POINT_FADE_ALPHA_CLAMP_EXT

        When the derived point size is larger than the threshold size defined by
        the GL_POINT_FADE_THRESHOLD_SIZE_EXT parameter, it might be desired to
        clamp the computed alpha to a minimum value, in order to keep the point
        visible. In this case the formula below change:

        factor = (derived_size/threshold)^2

                        factor                  clamp <= factor
        clamped_value =
                        clamp                   factor < clamp

                 1.0                            derived_size >= threshold
        alpha *=
                 clamped_value                  Otherwise

        where clamp is defined by the GL_POINT_FADE_ALPHA_CLAMP_EXT new parameter.

New Procedures and Functions

    void glPointParameterfEXT ( GLenum pname, GLfloat param );
    void glPointParameterfvEXT ( GLenum pname, const GLfloat *params );

New Tokens

    Accepted by the <pname> parameter of glPointParameterfEXT, and the <pname>
    of glGet:

        GL_POINT_SIZE_MIN_EXT
        GL_POINT_SIZE_MAX_EXT
        GL_POINT_FADE_THRESHOLD_SIZE_EXT

    Accepted by the <pname> parameter of glPointParameterfvEXT, and the <pname>
    of glGet:

        GL_POINT_SIZE_MIN_EXT              0x8126
        GL_POINT_SIZE_MAX_EXT              0x8127
        GL_POINT_FADE_THRESHOLD_SIZE_EXT   0x8128
        GL_DISTANCE_ATTENUATION_EXT        0x8129

Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    All parameters of the glPointParameterfEXT and glPointParameterfvEXT
    functions set various values applied to point rendering. The derived point
    size is defined to be the <size> provided with glPointSize modulated with a
    distance attenuation factor.

    The parameters GL_POINT_SIZE_MIN_EXT and GL_POINT_SIZE_MAX_EXT simply
    define an upper and lower bounds respectively on the derived point size.

    The above parameters affect non multisample points as well as multisample
    points, while the GL_POINT_FADE_THRESHOLD_SIZE_EXT parameter, has no effect
    on non multisample points. If the derived point size is larger than
    the threshold size defined by the GL_POINT_FADE_THRESHOLD_SIZE_EXT
    parameter, the derived point size is used as the diameter of the rasterized
    point, and the alpha component is intact. Otherwise, the threshold size is
    set to be the diameter of the rasterized point, while the alpha component is
    modulated accordingly, to compensate for the larger area.

    The distance attenuation function coefficients, namely a, b, and c in:

                        1
        dist_atten(d) = -------------------
                        a + b * d + c * d^2

    are defined by the <pname> parameter GL_DISTANCE_ATTENUATION_EXT of the
    function glPointParameterfvEXT. By default a = 1, b = 0, and c = 0.

    Let 'size' be the point size provided with glPointSize,  let 'dist' be the
    distance of the point from the eye, and let 'threshold' be the threshold size
    defined by the GL_POINT_FADE_THRESHOLD_SIZE parameter of
    glPointParameterfEXT. The derived point size is given by:

        derived_size = size * sqrt(dist_atten(dist))

    Note that when default values are used, the above formula reduces to:

        derived_size = size

    the diameter of the rasterized point is given by:

                   derived_size                 derived_size >= threshold
        diameter =
                   threshold                    Otherwise

    The alpha of a point is calculated to allow the fading of points instead of
    shrinking them past a defined threshold size. The alpha component of the
    rasterized point is given by:

                 1                              derived_size >= threshold
        alpha *=
                 (derived_size/threshold)^2     Otherwise

    The threshold defined by GL_POINT_FADE_THRESHOLD_SIZE_EXT is not clamped
    to the minimum and maximum point sizes.

    Points do not affect the current color.

    This extension doesn't change the feedback or selection behavior of points.

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Framebuffer)

    None

Additions to Chapter 5 of the 1.0 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.0 Specification (State and State Requests)

    None

Additions to the GLX Specification

    None

GLX Protocol

    Two new GL rendering commands are added. The following commands are
    sent to the server as part of a glXRender request:

        PointParameterfEXT
            2           8+4*n           rendering command length
            2           2065            rendering command opcode
            4           ENUM            pname
                        0x8126    n=1   POINT_SIZE_MIN_EXT
                        0x8127    n=1   POINT_SIZE_MAX_EXT
                        0x8128    n=1   POINT_FADE_THRESHOLD_SIZE_EXT
            4           FLOAT32         param

        PointParameterfvEXT
            2           8+4*n           rendering command length
            2           2066            rendering command opcode
            4           ENUM            pname
                        0x8126    n=1   POINT_SIZE_MIN_EXT
                        0x8127    n=1   POINT_SIZE_MAX_EXT
                        0x8128    n=1   POINT_FADE_THRESHOLD_SIZE_EXT
                        0x8129    n=3   POINT_DISTANCE_ATTENUATION_EXT
            4*n         LISTofFLOAT32   params

Dependencies on SGIS_multisample

    If SGIS_multisample is not implemented, then the references to
    multisample points are invalid, and should be ignored.

Errors

    INVALID_ENUM is generated if PointParameterfEXT parameter <pname> is not
    GL_POINT_SIZE_MIN_EXT, GL_POINT_SIZE_MAX_EXT, or
    GL_POINT_FADE_THRESHOLD_SIZE_EXT.

    INVALID_ENUM is generated if PointParameterfvEXT parameter <pname> is
    not GL_POINT_SIZE_MIN_EXT, GL_POINT_SIZE_MAX_EXT,
    GL_POINT_FADE_THRESHOLD_SIZE_EXT, or GL_DISTANCE_ATTENUATION_EXT

    INVALID_VALUE is generated when values are out of range according to:

    <pname>                                     valid range
    --------                                    -----------
    GL_POINT_SIZE_MIN_EXT                      >= 0
    GL_POINT_SIZE_MAX_EXT                      >= 0
    GL_POINT_FADE_THRESHOLD_SIZE_EXT           >= 0

    Issues
    ------
    -   should we generate INVALID_VALUE or just clamp?

New State

    Get Value                           Get Command     Type    Initial Value   Attribute
    ---------                           -----------     ----    ---------       ---------
    GL_POINT_SIZE_MIN_EXT               GetFloatv       R       0               point
    GL_POINT_SIZE_MAX_EXT               GetFloatv       R       M               point
    GL_POINT_FADE_THRESHOLD_SIZE_EXT    GetFloatv       R       1               point
    GL_DISTANCE_ATTENUATION_EXT         GetFloatv       3xR     (1,0,0)         point

    M is the largest available point size.

New Implementation Dependent State

    None

Backwards Compatibility

    This extension replaces SGIS_point_parameters. The procedures, tokens,
    and name strings now refer to EXT instead of SGIS. Enumerant values are
    unchanged. SGI implementations which previously provided this
    functionality should support both forms of the extension.

    EXT_point_parameters was promoted to ARB_point_parameters on June
    20, 2000. The EXT version is now considered obsolete.

Revision History

    * 1.8 (September 23, 2010) pbrown - add "const" qualifier to <params>
      argument to PointParameterfvARB.

    * 1.7 (March 12, 2002) - added GLX protocol, reverse engineered from
      SGI's GLX implementation.

    * 1.6 (August 21, 1997) - promoted from SGIS to EXT. Made the
      dependency on SGIS_multisample optional.
