15bd8deadSopenharmony_ciName
25bd8deadSopenharmony_ci
35bd8deadSopenharmony_ci    NV_point_sprite
45bd8deadSopenharmony_ci
55bd8deadSopenharmony_ciName Strings
65bd8deadSopenharmony_ci
75bd8deadSopenharmony_ci    GL_NV_point_sprite
85bd8deadSopenharmony_ci
95bd8deadSopenharmony_ciContact
105bd8deadSopenharmony_ci
115bd8deadSopenharmony_ci    Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com)
125bd8deadSopenharmony_ci
135bd8deadSopenharmony_ciNotice
145bd8deadSopenharmony_ci
155bd8deadSopenharmony_ci    Copyright NVIDIA Corporation, 2001, 2002.
165bd8deadSopenharmony_ci
175bd8deadSopenharmony_ciIP Status
185bd8deadSopenharmony_ci
195bd8deadSopenharmony_ci    No known IP issues.
205bd8deadSopenharmony_ci
215bd8deadSopenharmony_ciStatus
225bd8deadSopenharmony_ci
235bd8deadSopenharmony_ci    Shipping (version 1.1)
245bd8deadSopenharmony_ci
255bd8deadSopenharmony_ciVersion
265bd8deadSopenharmony_ci
275bd8deadSopenharmony_ci    NVIDIA Date: March 6, 2003 (version 1.3)
285bd8deadSopenharmony_ci
295bd8deadSopenharmony_ciNumber
305bd8deadSopenharmony_ci
315bd8deadSopenharmony_ci    262
325bd8deadSopenharmony_ci
335bd8deadSopenharmony_ciDependencies
345bd8deadSopenharmony_ci
355bd8deadSopenharmony_ci    Written based on the wording of the OpenGL 1.3 specification.
365bd8deadSopenharmony_ci
375bd8deadSopenharmony_ci    Assumes support for the EXT_point_parameters extension.
385bd8deadSopenharmony_ci
395bd8deadSopenharmony_ciOverview
405bd8deadSopenharmony_ci
415bd8deadSopenharmony_ci    Applications such as particle systems usually must use OpenGL quads
425bd8deadSopenharmony_ci    rather than points to render their geometry, since they would like to
435bd8deadSopenharmony_ci    use a custom-drawn texture for each particle, rather than the
445bd8deadSopenharmony_ci    traditional OpenGL round antialiased points, and each fragment in
455bd8deadSopenharmony_ci    a point has the same texture coordinates as every other fragment.
465bd8deadSopenharmony_ci
475bd8deadSopenharmony_ci    Unfortunately, specifying the geometry for these quads can be quite
485bd8deadSopenharmony_ci    expensive, since it quadruples the amount of geometry required, and
495bd8deadSopenharmony_ci    it may also require the application to do extra processing to compute
505bd8deadSopenharmony_ci    the location of each vertex.
515bd8deadSopenharmony_ci
525bd8deadSopenharmony_ci    The goal of this extension is to allow such apps to use points rather
535bd8deadSopenharmony_ci    than quads.  When GL_POINT_SPRITE_NV is enabled, the state of point
545bd8deadSopenharmony_ci    antialiasing is ignored.  For each texture unit, the app can then
555bd8deadSopenharmony_ci    specify whether to replace the existing texture coordinates with
565bd8deadSopenharmony_ci    point sprite texture coordinates, which are interpolated across the
575bd8deadSopenharmony_ci    point.  Finally, the app can set a global parameter for the way to
585bd8deadSopenharmony_ci    generate the R coordinate for point sprites; the R coordinate can
595bd8deadSopenharmony_ci    either be zero, the input S coordinate, or the input R coordinate.
605bd8deadSopenharmony_ci    This allows applications to use a 3D texture to represent a point
615bd8deadSopenharmony_ci    sprite that goes through an animation, with filtering between frames,
625bd8deadSopenharmony_ci    for example.
635bd8deadSopenharmony_ci
645bd8deadSopenharmony_ciIssues
655bd8deadSopenharmony_ci
665bd8deadSopenharmony_ci    *   Should this spec say that point sprites get converted into quads?
675bd8deadSopenharmony_ci
685bd8deadSopenharmony_ci        RESOLVED: No, this would make the spec much uglier, because then
695bd8deadSopenharmony_ci        we'd have to say that polygon smooth and stipple get turned off,
705bd8deadSopenharmony_ci        etc.  Better to provide a formula for computing the texture
715bd8deadSopenharmony_ci        coordinates and leave them as points.
725bd8deadSopenharmony_ci
735bd8deadSopenharmony_ci    *   How are point sprite texture coordinates computed?
745bd8deadSopenharmony_ci
755bd8deadSopenharmony_ci        RESOLVED: They move smoothly as the point moves around on the
765bd8deadSopenharmony_ci        screen, even though the pixels touched by the point do not.  The
775bd8deadSopenharmony_ci        exact formula is given in the spec.  Note that point sprites' T
785bd8deadSopenharmony_ci        texture coordinate decreases, not increases, with Y; that is,
795bd8deadSopenharmony_ci        point sprite textures go top-down, not bottom-up.
805bd8deadSopenharmony_ci
815bd8deadSopenharmony_ci    *   How do point sizes for point sprites work?
825bd8deadSopenharmony_ci
835bd8deadSopenharmony_ci        RESOLVED: The original NV_point_sprite spec treated point sprites
845bd8deadSopenharmony_ci        as being sized like aliased points, i.e., integral sizes only.
855bd8deadSopenharmony_ci        This was a mistake, because it can lead to visible popping
865bd8deadSopenharmony_ci        artifacts.  In addition, it limits the size of points
875bd8deadSopenharmony_ci        unnecessarily.
885bd8deadSopenharmony_ci
895bd8deadSopenharmony_ci        This revised specification treats point sprite sizes more like
905bd8deadSopenharmony_ci        antialiased point sizes, but with more leniency.  Implementations
915bd8deadSopenharmony_ci        may choose to not clamp the point size to the antialiased point
925bd8deadSopenharmony_ci        size range.  The set of point sprite sizes available must be a
935bd8deadSopenharmony_ci        superset of the antialiased point sizes.  However, whereas
945bd8deadSopenharmony_ci        antialiased point sizes are all evenly spaced by the point size
955bd8deadSopenharmony_ci        granularity, point sprites can have an arbitrary set of sizes.
965bd8deadSopenharmony_ci        This lets implementations use, e.g., floating-point sizes.
975bd8deadSopenharmony_ci
985bd8deadSopenharmony_ci        It is anticipated that this behavior change will not cause any
995bd8deadSopenharmony_ci        problems for compatibility.  In fact, it should be beneficial to
1005bd8deadSopenharmony_ci        quality.
1015bd8deadSopenharmony_ci
1025bd8deadSopenharmony_ci    *   Should there be a way to query the list of supported point sprite
1035bd8deadSopenharmony_ci        sizes?
1045bd8deadSopenharmony_ci
1055bd8deadSopenharmony_ci        RESOLVED: No.  If an implementation were to use, say, a single-
1065bd8deadSopenharmony_ci        precision IEEE float to represent point sizes, the list would be
1075bd8deadSopenharmony_ci        rather long.
1085bd8deadSopenharmony_ci
1095bd8deadSopenharmony_ci    *   Do mipmaps apply to point sprites?
1105bd8deadSopenharmony_ci
1115bd8deadSopenharmony_ci        RESOLVED: Yes.  They are similar to quads in this respect.
1125bd8deadSopenharmony_ci
1135bd8deadSopenharmony_ci    *   What of this extension's state is per-texture unit and what
1145bd8deadSopenharmony_ci        of this extension's state is state is global?
1155bd8deadSopenharmony_ci
1165bd8deadSopenharmony_ci        RESOLVED: The GL_POINT_SPRITE_NV enable and POINT_SPRITE_R_MODE_NV
1175bd8deadSopenharmony_ci        state are global.  The COORD_REPLACE_NV state is per-texture unit
1185bd8deadSopenharmony_ci        (state set by TexEnv is per-texture unit).
1195bd8deadSopenharmony_ci
1205bd8deadSopenharmony_ci    *   Should we create an entry point for the R mode?
1215bd8deadSopenharmony_ci
1225bd8deadSopenharmony_ci        RESOLVED: No, we take advantage of the existing glPointParameter
1235bd8deadSopenharmony_ci        interface.  Unfortunately, EXT_point_parameters does not define a
1245bd8deadSopenharmony_ci        PointParameteri entry point.  This extension adds one.  It could
1255bd8deadSopenharmony_ci        live without, but it's a little annoying to have to use a float
1265bd8deadSopenharmony_ci        interface to specify an enumerant.
1275bd8deadSopenharmony_ci
1285bd8deadSopenharmony_ci        This is definitely not TexEnv state, because it is global, not
1295bd8deadSopenharmony_ci        per texture unit.
1305bd8deadSopenharmony_ci
1315bd8deadSopenharmony_ci    *   What should the suffix for PointParameteri[v] be?
1325bd8deadSopenharmony_ci
1335bd8deadSopenharmony_ci        RESOLVED: NV.  This is an NV extension, and therefore any new
1345bd8deadSopenharmony_ci        entry points must be NV also.  This is a bit less aesthetically
1355bd8deadSopenharmony_ci        pleasing than matching the EXT suffixes of EXT_point_parameters,
1365bd8deadSopenharmony_ci        but it is the right thing to do.
1375bd8deadSopenharmony_ci
1385bd8deadSopenharmony_ci    *   Should there be a global on/off switch for point sprites, or
1395bd8deadSopenharmony_ci        should the per-unit enable imply that switch?
1405bd8deadSopenharmony_ci
1415bd8deadSopenharmony_ci        RESOLVED: There is a global switch to turn it on and off.  This
1425bd8deadSopenharmony_ci        is probably more convenient for both driver and app, and it
1435bd8deadSopenharmony_ci        simplifies the spec.
1445bd8deadSopenharmony_ci
1455bd8deadSopenharmony_ci    *   What should the TexEnv mode for point sprites be called?
1465bd8deadSopenharmony_ci
1475bd8deadSopenharmony_ci        RESOLVED: After much deliberation, COORD_REPLACE_NV seems to be
1485bd8deadSopenharmony_ci        appropriate.
1495bd8deadSopenharmony_ci
1505bd8deadSopenharmony_ci    *   What is the motivation for each of the three point sprite R
1515bd8deadSopenharmony_ci        modes?
1525bd8deadSopenharmony_ci
1535bd8deadSopenharmony_ci        The R mode is most convenient for applications that may already
1545bd8deadSopenharmony_ci        be drawing their own "point sprites" by rendering quads.  These
1555bd8deadSopenharmony_ci        applications already need to put the R coordinate in R, and they
1565bd8deadSopenharmony_ci        do not need to change their code.
1575bd8deadSopenharmony_ci
1585bd8deadSopenharmony_ci        The S mode is most convenient for applications that do not use
1595bd8deadSopenharmony_ci        vertex programs, because it allows them to use TexCoord1 rather
1605bd8deadSopenharmony_ci        than TexCoord3 to specify their third texture coordinate.  This
1615bd8deadSopenharmony_ci        reduces the size of the vertex data.  Applications that use
1625bd8deadSopenharmony_ci        vertex programs are largely unaffected by this, because they can
1635bd8deadSopenharmony_ci        map the input S texture coordinate into the output R coordinate
1645bd8deadSopenharmony_ci        if they so desire.
1655bd8deadSopenharmony_ci
1665bd8deadSopenharmony_ci        The zero mode may allow some applications to more easily obtain
1675bd8deadSopenharmony_ci        the behavior they want out of the dot product functionality of
1685bd8deadSopenharmony_ci        the NV_texture_shader extension.  It reduces these dot products
1695bd8deadSopenharmony_ci        from three-component dot products into two-component dot
1705bd8deadSopenharmony_ci        products.  In some implementations, it may also have higher
1715bd8deadSopenharmony_ci        performance than the other modes.
1725bd8deadSopenharmony_ci
1735bd8deadSopenharmony_ci        There is no mode corresponding to the T or Q coordinates because
1745bd8deadSopenharmony_ci        we cannot envision a scenario where such modes would be useful.
1755bd8deadSopenharmony_ci
1765bd8deadSopenharmony_ci    *   What is the interaction with multisample points, which are round?
1775bd8deadSopenharmony_ci
1785bd8deadSopenharmony_ci        RESOLVED: Point sprites are rasterized as squares, even in
1795bd8deadSopenharmony_ci        multisample mode.  Leaving them as round points would make the
1805bd8deadSopenharmony_ci        feature useless.
1815bd8deadSopenharmony_ci
1825bd8deadSopenharmony_ci    *   How does the point sprite extension interact with fragment
1835bd8deadSopenharmony_ci        program extensions (ARB_fragment_program, NV_fragment_program,
1845bd8deadSopenharmony_ci        etc)?
1855bd8deadSopenharmony_ci
1865bd8deadSopenharmony_ci        RESOLVED: The primary issue is how the interpolanted texture
1875bd8deadSopenharmony_ci        coordinate set appears when fragment attribute variables
1885bd8deadSopenharmony_ci        (ARB terminology) or fragment program attribute registers (NV
1895bd8deadSopenharmony_ci        terminology) are accessed.
1905bd8deadSopenharmony_ci
1915bd8deadSopenharmony_ci        When point sprite is enabled and the GL_COORD_REPLACE_NV state for
1925bd8deadSopenharmony_ci        a given texture unit is GL_TRUE, the texture coordinate set for
1935bd8deadSopenharmony_ci        that texture unit is (s,t,r,1) where the point sprite-overriden
1945bd8deadSopenharmony_ci        s, t, and r are described in the amended Section 3.3 below.
1955bd8deadSopenharmony_ci        The important point is that q is forced to 1.
1965bd8deadSopenharmony_ci
1975bd8deadSopenharmony_ci        For fragment program extensions, q cooresponds to the w component
1985bd8deadSopenharmony_ci        of the respective fragment attribute.
1995bd8deadSopenharmony_ci
2005bd8deadSopenharmony_ci    *   What push/pop attribute bits control the state of this extension?
2015bd8deadSopenharmony_ci
2025bd8deadSopenharmony_ci        RESOLVED:  POINT_BIT for all the state.  Also ENABLE_BIT for
2035bd8deadSopenharmony_ci        the POINT_SPRITE_NV enable.
2045bd8deadSopenharmony_ci
2055bd8deadSopenharmony_ciNew Procedures and Functions
2065bd8deadSopenharmony_ci
2075bd8deadSopenharmony_ci    void PointParameteriNV(enum pname, int param)
2085bd8deadSopenharmony_ci    void PointParameterivNV(enum pname, const int *params)
2095bd8deadSopenharmony_ci
2105bd8deadSopenharmony_ciNew Tokens
2115bd8deadSopenharmony_ci
2125bd8deadSopenharmony_ci    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, by
2135bd8deadSopenharmony_ci    the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
2145bd8deadSopenharmony_ci    GetDoublev, and by the <target> parameter of TexEnvi, TexEnviv,
2155bd8deadSopenharmony_ci    TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv:
2165bd8deadSopenharmony_ci
2175bd8deadSopenharmony_ci        POINT_SPRITE_NV                                0x8861
2185bd8deadSopenharmony_ci
2195bd8deadSopenharmony_ci    When the <target> parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv,
2205bd8deadSopenharmony_ci    GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_NV, then the value of
2215bd8deadSopenharmony_ci    <pname> may be:
2225bd8deadSopenharmony_ci
2235bd8deadSopenharmony_ci        COORD_REPLACE_NV                               0x8862
2245bd8deadSopenharmony_ci
2255bd8deadSopenharmony_ci    When the <target> and <pname> parameters of TexEnvf, TexEnvfv,
2265bd8deadSopenharmony_ci    TexEnvi, or TexEnviv are POINT_SPRITE_NV and COORD_REPLACE_NV
2275bd8deadSopenharmony_ci    respectively, then the value of <param> or the value pointed to by
2285bd8deadSopenharmony_ci    <params> may be:
2295bd8deadSopenharmony_ci
2305bd8deadSopenharmony_ci        FALSE
2315bd8deadSopenharmony_ci        TRUE
2325bd8deadSopenharmony_ci
2335bd8deadSopenharmony_ci    Accepted by the <pname> parameter of PointParameteriNV,
2345bd8deadSopenharmony_ci    PointParameterfEXT, PointParameterivNV, PointParameterfvEXT,
2355bd8deadSopenharmony_ci    GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev:
2365bd8deadSopenharmony_ci
2375bd8deadSopenharmony_ci        POINT_SPRITE_R_MODE_NV                         0x8863
2385bd8deadSopenharmony_ci
2395bd8deadSopenharmony_ci    When the <pname> parameter of PointParameteriNV, PointParameterfEXT,
2405bd8deadSopenharmony_ci    PointParameterivNV, or PointParameterfvEXT is
2415bd8deadSopenharmony_ci    POINT_SPRITE_R_MODE_NV, then the value of <param> or the value
2425bd8deadSopenharmony_ci    pointed to by <params> may be:
2435bd8deadSopenharmony_ci
2445bd8deadSopenharmony_ci        ZERO
2455bd8deadSopenharmony_ci        S
2465bd8deadSopenharmony_ci        R
2475bd8deadSopenharmony_ci
2485bd8deadSopenharmony_ciAdditions to Chapter 2 of the OpenGL 1.3 Specification (OpenGL Operation)
2495bd8deadSopenharmony_ci
2505bd8deadSopenharmony_ci    None.
2515bd8deadSopenharmony_ci
2525bd8deadSopenharmony_ciAdditions to Chapter 3 of the OpenGL 1.3 Specification (Rasterization)
2535bd8deadSopenharmony_ci
2545bd8deadSopenharmony_ci    Insert the following paragraphs after the second paragraph of section
2555bd8deadSopenharmony_ci    3.3 (page 63):
2565bd8deadSopenharmony_ci
2575bd8deadSopenharmony_ci    "Point sprites are enabled or disabled by calling Enable or Disable
2585bd8deadSopenharmony_ci    with the symbolic constant POINT_SPRITE_NV.  The default state is for
2595bd8deadSopenharmony_ci    point sprites to be disabled.  When point sprites are enabled, the
2605bd8deadSopenharmony_ci    state of the point antialiasing enable is ignored.
2615bd8deadSopenharmony_ci
2625bd8deadSopenharmony_ci    The point sprite R coordinate mode is set with one of the commands
2635bd8deadSopenharmony_ci
2645bd8deadSopenharmony_ci      void PointParameter{if}NV(enum pname, T param)
2655bd8deadSopenharmony_ci      void PointParameter{if}vNV(enum pname, const T *params)
2665bd8deadSopenharmony_ci
2675bd8deadSopenharmony_ci    where pname is POINT_SPRITE_R_MODE_NV.  The possible values for param
2685bd8deadSopenharmony_ci    are ZERO, S, and R.  The default value is ZERO.
2695bd8deadSopenharmony_ci
2705bd8deadSopenharmony_ci    The point sprite texture coordinate replacement mode is set with one
2715bd8deadSopenharmony_ci    of the commands
2725bd8deadSopenharmony_ci
2735bd8deadSopenharmony_ci      void TexEnv{if}(enum target, enum pname, T param)
2745bd8deadSopenharmony_ci      void TexEnv{if}v(enum target, enum pname, const T *params)
2755bd8deadSopenharmony_ci
2765bd8deadSopenharmony_ci    where target is POINT_SPRITE_NV and pname is COORD_REPLACE_NV.  The
2775bd8deadSopenharmony_ci    possible values for param are FALSE and TRUE.  The default value for
2785bd8deadSopenharmony_ci    each texture unit is for point sprite texture coordinate replacement
2795bd8deadSopenharmony_ci    to be disabled."
2805bd8deadSopenharmony_ci
2815bd8deadSopenharmony_ci    Replace the first two sentences of the fourth paragraph of section
2825bd8deadSopenharmony_ci    3.3 (page 63) with the following:
2835bd8deadSopenharmony_ci
2845bd8deadSopenharmony_ci    "The effect of a point width other than 1.0 depends on the state of
2855bd8deadSopenharmony_ci    point antialiasing and point sprites.  If antialiasing and point
2865bd8deadSopenharmony_ci    sprites are disabled, ..."
2875bd8deadSopenharmony_ci
2885bd8deadSopenharmony_ci    Replace the first sentences of the sixth paragraph of section 3.3
2895bd8deadSopenharmony_ci    (page 64) with the following:
2905bd8deadSopenharmony_ci
2915bd8deadSopenharmony_ci    "If antialiasing is enabled and point sprites are disabled, ..."
2925bd8deadSopenharmony_ci
2935bd8deadSopenharmony_ci    Insert the following paragraphs at the end of section 3.3 (page 66):
2945bd8deadSopenharmony_ci
2955bd8deadSopenharmony_ci    "When point sprites are enabled, then point rasterization produces a
2965bd8deadSopenharmony_ci    fragment for each framebuffer pixel whose center lies inside a square
2975bd8deadSopenharmony_ci    centered at the point's (x_w, y_w), with side length equal to the
2985bd8deadSopenharmony_ci    current point size.
2995bd8deadSopenharmony_ci
3005bd8deadSopenharmony_ci    All fragments produced in rasterizing a point sprite are assigned the
3015bd8deadSopenharmony_ci    same associated data, which are those of the vertex corresponding to
3025bd8deadSopenharmony_ci    the point, with texture coordinates s, t, and r replaced with s/q,
3035bd8deadSopenharmony_ci    t/q, and r/q, respectively.  If q is less than or equal to zero, the
3045bd8deadSopenharmony_ci    results are undefined.  However, for each texture unit where
3055bd8deadSopenharmony_ci    COORD_REPLACE_NV is TRUE, these texture coordinates are replaced with
3065bd8deadSopenharmony_ci    point sprite texture coordinates.  The s coordinate varies from 0 to
3075bd8deadSopenharmony_ci    1 across the point horizontally, while the t coordinate varies from 0
3085bd8deadSopenharmony_ci    to 1 vertically.  The r coordinate depends on the value of
3095bd8deadSopenharmony_ci    POINT_SPRITE_R_MODE_NV.  If this is set to ZERO, then the r
3105bd8deadSopenharmony_ci    coordinate is set to zero.  If it is set to S, then the r coordinate
3115bd8deadSopenharmony_ci    is set to the s texture coordinate before coordinate replacement
3125bd8deadSopenharmony_ci    takes place.  If it is set to R, then the r coordinate is set to the
3135bd8deadSopenharmony_ci    r texture coordinate before coordinate replacement takes place.
3145bd8deadSopenharmony_ci
3155bd8deadSopenharmony_ci    The following formula is used to evaluate the s and t coordinates:
3165bd8deadSopenharmony_ci
3175bd8deadSopenharmony_ci      s = 1/2 + (x_f + 1/2 - x_w) / size
3185bd8deadSopenharmony_ci      t = 1/2 - (y_f + 1/2 - y_w) / size
3195bd8deadSopenharmony_ci
3205bd8deadSopenharmony_ci    where size is the point's size, x_f and y_f are the (integral) window
3215bd8deadSopenharmony_ci    coordinates of the fragment, and x_w and y_w are the exact, unrounded
3225bd8deadSopenharmony_ci    window coordinates of the vertex for the point.
3235bd8deadSopenharmony_ci
3245bd8deadSopenharmony_ci    The widths supported for point sprites must be a superset of those
3255bd8deadSopenharmony_ci    supported for antialiased points.  There is no requirement that these
3265bd8deadSopenharmony_ci    widths must be equally spaced.  If an unsupported width is requested,
3275bd8deadSopenharmony_ci    the nearest supported width is used instead."
3285bd8deadSopenharmony_ci
3295bd8deadSopenharmony_ci    Replace the text of section 3.3.1 (page 66) with the following:
3305bd8deadSopenharmony_ci
3315bd8deadSopenharmony_ci    "The state required to control point rasterization consists of the
3325bd8deadSopenharmony_ci    floating-point point width, a bit indicating whether or not
3335bd8deadSopenharmony_ci    antialiasing is enabled, a bit indicating whether or not point
3345bd8deadSopenharmony_ci    sprites are enabled, the current value of the point sprite R
3355bd8deadSopenharmony_ci    coordinate mode, and a bit for the point sprite texture coordinate
3365bd8deadSopenharmony_ci    replacement mode for each texture unit."
3375bd8deadSopenharmony_ci
3385bd8deadSopenharmony_ci    Replace the text of section 3.3.2 (page 66) with the following:
3395bd8deadSopenharmony_ci
3405bd8deadSopenharmony_ci    "If MULTISAMPLE is enabled, and the value of SAMPLE_BUFFERS is one,
3415bd8deadSopenharmony_ci    then points are rasterized using the following algorithm, regardless
3425bd8deadSopenharmony_ci    of whether point antialiasing (POINT_SMOOTH) is enabled or disabled.
3435bd8deadSopenharmony_ci    Point rasterization produces a fragment for each framebuffer pixel
3445bd8deadSopenharmony_ci    with one or more sample points that intersect a region centered at
3455bd8deadSopenharmony_ci    the point's (x_w, y_w).  This region is a circle having diameter
3465bd8deadSopenharmony_ci    equal to the current point width if POINT_SPRITE_NV is disabled, or
3475bd8deadSopenharmony_ci    a square with side equal to the current point width if
3485bd8deadSopenharmony_ci    POINT_SPRITE_NV is enabled.  Coverage bits that correspond to sample
3495bd8deadSopenharmony_ci    points that intersect the region are 1, other coverage bits are 0.
3505bd8deadSopenharmony_ci    All data associated with each sample for the fragment are the data
3515bd8deadSopenharmony_ci    associated with the point being rasterized, with the exception of
3525bd8deadSopenharmony_ci    texture coordinates when POINT_SPRITE_NV is enabled; these texture
3535bd8deadSopenharmony_ci    coordinates are computed as described in section 3.3.
3545bd8deadSopenharmony_ci
3555bd8deadSopenharmony_ci    Point size range and number of gradations are equivalent to those
3565bd8deadSopenharmony_ci    supported for antialiased points when POINT_SPRITE_NV is disabled.
3575bd8deadSopenharmony_ci    The set of point sizes supported is equivalent to those for point
3585bd8deadSopenharmony_ci    sprites without multisample when POINT_SPRITE_NV is enabled."
3595bd8deadSopenharmony_ci
3605bd8deadSopenharmony_ciAdditions to Chapter 4 of the OpenGL 1.3 Specification (Per-Fragment
3615bd8deadSopenharmony_ciOperations and the Frame Buffer)
3625bd8deadSopenharmony_ci
3635bd8deadSopenharmony_ci    None.
3645bd8deadSopenharmony_ci
3655bd8deadSopenharmony_ciAdditions to Chapter 5 of the OpenGL 1.3 Specification (Special Functions)
3665bd8deadSopenharmony_ci
3675bd8deadSopenharmony_ci    None.
3685bd8deadSopenharmony_ci
3695bd8deadSopenharmony_ciAdditions to Chapter 6 of the OpenGL 1.3 Specification (State and
3705bd8deadSopenharmony_ciState Requests)
3715bd8deadSopenharmony_ci
3725bd8deadSopenharmony_ci    None.
3735bd8deadSopenharmony_ci
3745bd8deadSopenharmony_ciGLX Protocol
3755bd8deadSopenharmony_ci
3765bd8deadSopenharmony_ci    Two new GL rendering commands are added. The following commands are
3775bd8deadSopenharmony_ci    sent to the server as part of a glXRender request:
3785bd8deadSopenharmony_ci
3795bd8deadSopenharmony_ci        PointParameteriNV
3805bd8deadSopenharmony_ci            2           12              rendering command length
3815bd8deadSopenharmony_ci            2           4221            rendering command opcode
3825bd8deadSopenharmony_ci            4           ENUM            pname
3835bd8deadSopenharmony_ci                        0x8126 n==1     POINT_SIZE_MIN_ARB
3845bd8deadSopenharmony_ci                        0x8127 n==1     POINT_SIZE_MAX_ARB
3855bd8deadSopenharmony_ci                        0x8128 n==1     POINT_FADE_THRESHOLD_SIZE_ARB
3865bd8deadSopenharmony_ci                        0x8863 n==1     POINT_SPRITE_R_MODE_NV
3875bd8deadSopenharmony_ci            4           INT32           param
3885bd8deadSopenharmony_ci
3895bd8deadSopenharmony_ci        PointParameterivNV 
3905bd8deadSopenharmony_ci            2           8+4*n           rendering command length
3915bd8deadSopenharmony_ci            2           4222            rendering command opcode
3925bd8deadSopenharmony_ci            4           ENUM            pname
3935bd8deadSopenharmony_ci                        0x8126 n==1     POINT_SIZE_MIN_ARB
3945bd8deadSopenharmony_ci                        0x8127 n==1     POINT_SIZE_MAX_ARB
3955bd8deadSopenharmony_ci                        0x8128 n==1     POINT_FADE_THRESHOLD_SIZE_ARB
3965bd8deadSopenharmony_ci                        0x8129 n==3     DISTANCE_ATTENUATION_ARB
3975bd8deadSopenharmony_ci                        0x8863 n==1     POINT_SPRITE_R_MODE_NV
3985bd8deadSopenharmony_ci            4*n         LISTofINT32     params
3995bd8deadSopenharmony_ci
4005bd8deadSopenharmony_ciErrors
4015bd8deadSopenharmony_ci
4025bd8deadSopenharmony_ci    None.
4035bd8deadSopenharmony_ci
4045bd8deadSopenharmony_ciNew State
4055bd8deadSopenharmony_ci
4065bd8deadSopenharmony_ci(table 6.12, p. 220)
4075bd8deadSopenharmony_ci
4085bd8deadSopenharmony_ci    Get Value                Type    Get Command     Initial Value   Description             Sec    Attribute
4095bd8deadSopenharmony_ci    ---------                ----    -----------     -------------   -----------             ------ ---------
4105bd8deadSopenharmony_ci    POINT_SPRITE_NV          B       IsEnabled       False           point sprite enable     3.3    point/enable
4115bd8deadSopenharmony_ci    POINT_SPRITE_R_MODE_NV   Z3      GetIntegerv     ZERO            R coordinate mode       3.3    point
4125bd8deadSopenharmony_ci
4135bd8deadSopenharmony_ci(table 6.17, p. 225)
4145bd8deadSopenharmony_ci
4155bd8deadSopenharmony_ci    Get Value                Type    Get Command     Initial Value   Description             Sec    Attribute
4165bd8deadSopenharmony_ci    ---------                ----    -----------     -------------   -----------             ------ ---------
4175bd8deadSopenharmony_ci    COORD_REPLACE_NV         2* x B  GetTexEnviv     False           coordinate replacement  3.3    point
4185bd8deadSopenharmony_ci                                                                     enable
4195bd8deadSopenharmony_ci
4205bd8deadSopenharmony_ciNVIDIA Implementation Details
4215bd8deadSopenharmony_ci
4225bd8deadSopenharmony_ci    This extension was first supported for GeForce4 Ti only in NVIDIA's
4235bd8deadSopenharmony_ci    Release 25 drivers.  Future drivers will support this extension on
4245bd8deadSopenharmony_ci    all GeForce products.
4255bd8deadSopenharmony_ci
4265bd8deadSopenharmony_ci    However, the extension is only hardware-accelerated on the GeForce3
4275bd8deadSopenharmony_ci    and GeForce4 Ti platforms.  In addition, there are restrictions on
4285bd8deadSopenharmony_ci    the cases that are accelerated on the GeForce3.
4295bd8deadSopenharmony_ci
4305bd8deadSopenharmony_ci    In order to ensure that you get hardware acceleration on GeForce3,
4315bd8deadSopenharmony_ci    make sure that:
4325bd8deadSopenharmony_ci
4335bd8deadSopenharmony_ci    1. The point sprite R mode is set to GL_ZERO.  (This is the default.)
4345bd8deadSopenharmony_ci    2. Coordinate replacement is turned on for texture unit 3 and for no
4355bd8deadSopenharmony_ci       other texture units.  This is non-obvious; using texture unit zero
4365bd8deadSopenharmony_ci       will _not_ be accelerated.  Also, if coordinate replacement is off
4375bd8deadSopenharmony_ci       for _all_ texture units, that's also unaccelerated.
4385bd8deadSopenharmony_ci
4395bd8deadSopenharmony_ci    So, in the typical usage case where you just want a single texture on
4405bd8deadSopenharmony_ci    some points, you should enable TEXTURE_2D on unit 3 but disable it on
4415bd8deadSopenharmony_ci    unit zero.
4425bd8deadSopenharmony_ci
4435bd8deadSopenharmony_ci    The GeForce4 Ti platform supports point sprites as large as 8192, but
4445bd8deadSopenharmony_ci    the spacing between sizes becomes larger as the size increases.  All
4455bd8deadSopenharmony_ci    other platforms do not support point sprite sizes above 64.
4465bd8deadSopenharmony_ci
4475bd8deadSopenharmony_ciATI Implementation Details
4485bd8deadSopenharmony_ci
4495bd8deadSopenharmony_ci    This extension is supported on the Radeon 8000 series and later
4505bd8deadSopenharmony_ci    platforms.
4515bd8deadSopenharmony_ci
4525bd8deadSopenharmony_ci    In order to ensure that Radeon 8000 series will accelerate point
4535bd8deadSopenharmony_ci    sprite rendering using TCL hardware, make sure that the point sprite
4545bd8deadSopenharmony_ci    R mode is set to GL_ZERO.  (This is the default.)
4555bd8deadSopenharmony_ci
4565bd8deadSopenharmony_ci    Radeon 8000 series can render points as large as 2047.
4575bd8deadSopenharmony_ci
4585bd8deadSopenharmony_ciRevision History
4595bd8deadSopenharmony_ci
4605bd8deadSopenharmony_ci    June 4, 2002 - Added implementation details section.  Fixed a typo in
4615bd8deadSopenharmony_ci    the overview.  Changed behavior of point sizes so that fractional
4625bd8deadSopenharmony_ci    sizes are allowed and so that implementations can support large point
4635bd8deadSopenharmony_ci    sprites or use floating-point point size representations.
4645bd8deadSopenharmony_ci    Significant rewrite of spec language to cover this new point size
4655bd8deadSopenharmony_ci    behavior.
4665bd8deadSopenharmony_ci
4675bd8deadSopenharmony_ci    July 5, 2002 - Finished GLX protocol.
4685bd8deadSopenharmony_ci
4695bd8deadSopenharmony_ci    March 6, 2003 - Added issue to clarify Q handling for fragment
4705bd8deadSopenharmony_ci    program extensions.  Added issue to clarify push/pop attrib handling.
4715bd8deadSopenharmony_ci    Adjusted state tables so COORD_REPLACE_NV state appears in the
4725bd8deadSopenharmony_ci    texture environment and generation table.
473