| Name |
| |
| ARB_point_sprite |
| |
| Name Strings |
| |
| GL_ARB_point_sprite |
| |
| Contact |
| |
| Matt Craighead, NVIDIA Corporation (mcraighead 'at' nvidia.com) |
| Mark Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) |
| Pat Brown, NVIDIA Corporation (pbrown 'at' nvidia.com) |
| |
| Notice |
| |
| Copyright (c) 2003-2013 The Khronos Group Inc. Copyright terms at |
| http://www.khronos.org/registry/speccopyright.html |
| |
| Specification Update Policy |
| |
| Khronos-approved extension specifications are updated in response to |
| issues and bugs prioritized by the Khronos OpenGL Working Group. For |
| extensions which have been promoted to a core Specification, fixes will |
| first appear in the latest version of that core Specification, and will |
| eventually be backported to the extension document. This policy is |
| described in more detail at |
| https://www.khronos.org/registry/OpenGL/docs/update_policy.php |
| |
| IP Status |
| |
| No known IP issues. |
| |
| Status |
| |
| Approved by the ARB on July 24, 2003. |
| |
| Version |
| |
| Last Modified Date: July 22, 2003 |
| Revision: 7 |
| |
| Number |
| |
| ARB Extension #35 |
| |
| Dependencies |
| |
| Written based on the wording of the OpenGL 1.4 specification. |
| |
| NV_point_sprite affects the definition of this extension. |
| |
| Overview |
| |
| Applications such as particle systems have tended to use OpenGL quads |
| rather than points to render their geometry, since they would like |
| to use a custom-drawn texture for each particle, rather than the |
| traditional OpenGL round antialiased points, and each fragment in |
| a point has the same texture coordinates as every other fragment. |
| |
| Unfortunately, specifying the geometry for these quads can be |
| expensive, since it quadruples the amount of geometry required, and |
| may also require the application to do extra processing to compute |
| the location of each vertex. |
| |
| The purpose of this extension is to allow such applications to use |
| points rather than quads. When GL_POINT_SPRITE_ARB is enabled, |
| the state of point antialiasing is ignored. For each texture unit, |
| the app can then specify whether to replace the existing texture |
| coordinates with point sprite texture coordinates, which are |
| interpolated across the point. |
| |
| Issues |
| |
| * Should this spec say that point sprites get converted into quads? |
| |
| RESOLVED: No, this would make the spec much uglier, because then |
| we'd have to say that polygon smooth and stipple get turned off, |
| etc. Better to provide a formula for computing the texture |
| coordinates and leave them as points. |
| |
| * How are point sprite texture coordinates computed? |
| |
| RESOLVED: They move smoothly as the point moves around on the |
| screen, even though the pixels touched by the point do not. The |
| exact formula is given in the spec below. |
| |
| A point sprite can be thought of as a quad whose upper-left corner has |
| (s,t) texture coordinates of (0,0) and whose lower-right corner has |
| texture coordinates of (1,1), as illustrated in the following figure. |
| In the figure "P" is the center of the point sprite, and "O" is the |
| origin (0,0) of the window coordinate system. Note that the y window |
| coordinate increases from bottom-to-top but the t texture coordinate |
| of point sprites increases from top-to-bottom. |
| |
| ^ |
| +y| (0,0) |
| | +-----+ |
| | | | |
| | | P | |
| | | | |
| | +-----+ |
| | (1,1) |
| | +x |
| O---------------> |
| |
| Applications using a single texture for both point sprites and other |
| geometry need to account for the fixed coordinate mapping of point |
| sprites. |
| |
| * Is the ARB specification different from the NV version? |
| |
| RESOLVED: Yes. The point sprite R mode has been removed. The |
| wording has also been updated to reflect version 1.4 of the core |
| OpenGL specification however. The enumerant values are unchanged. |
| |
| * How do point sizes for point sprites work? |
| |
| RESOLVED: This specification treats point sprite sizes like |
| antialiased point sizes, but with more leniency. Implementations |
| may choose to not clamp the point size to the antialiased point |
| size range. The set of point sprite sizes available must be |
| a superset of the antialiased point sizes. However, whereas |
| antialiased point sizes are all evenly spaced by the point size |
| granularity, point sprites can have an arbitrary set of sizes. |
| This lets implementations use, e.g., floating-point sizes. |
| |
| * Should there be a way to query the list of supported point sprite |
| sizes? |
| |
| RESOLVED: No. If an implementation were to use, say, a single- |
| precision IEEE float to represent point sizes, the list would be |
| rather long. |
| |
| * Do mipmaps apply to point sprites? |
| |
| RESOLVED: Yes. They are similar to quads in this respect. |
| |
| * What of this extension's state is per-texture unit and what |
| of this extension's state is state is global? |
| |
| RESOLVED: The GL_POINT_SPRITE_ARB enable is global. The |
| COORD_REPLACE_ARB state is per-texture unit (state set by TexEnv is |
| per-texture unit). |
| |
| * Should there be a global on/off switch for point sprites, or |
| should the per-unit enable imply that switch? |
| |
| RESOLVED: There is a global switch to turn it on and off. This |
| is probably more convenient for both driver and app, and it |
| simplifies the spec. |
| |
| * What should the TexEnv mode for point sprites be called? |
| |
| RESOLVED: COORD_REPLACE_ARB. |
| |
| * What is the interaction with multisample points, which are round? |
| |
| RESOLVED: Point sprites are rasterized as squares, even in |
| multisample mode. Leaving them as round points would make the |
| feature useless. |
| |
| * How does the point sprite extension interact with fragment |
| program extensions (ARB_fragment_program, NV_fragment_program, |
| etc)? |
| |
| RESOLVED: The primary issue is how the interpolated texture |
| coordinate set appears when fragment attribute variables |
| (ARB terminology) or fragment program attribute registers (NV |
| terminology) are accessed. |
| |
| When point sprite is enabled and the GL_COORD_REPLACE_ARB state for |
| a given texture unit is GL_TRUE, the texture coordinate set for |
| that texture unit is (s,t,0,1) where the point sprite-overridden |
| s and t are described in the amended Section 3.3 below. The |
| important point is that r and q are forced to 0 and 1, respectively. |
| |
| For fragment program extensions, r and q correspond to the z and w |
| components of the respective fragment attribute. |
| |
| * How does this extension interact with PolygonMode? |
| |
| RESOLVED: If a polygon is rendered in point mode and POINT_SPRITE_ARB |
| is enabled, its vertices will be rendered as point sprites. |
| |
| * How does this extension interact with the point size attenuation |
| functionality in ARB_point_parameters and OpenGL 1.4? |
| |
| RESOLVED: Point sprites sizes are attenuated just like the sizes of |
| non-sprite points. |
| |
| * What push/pop attribute bits control the state of this extension? |
| |
| RESOLVED: POINT_BIT for all the state. Also ENABLE_BIT for |
| the POINT_SPRITE_ARB enable. |
| |
| * How are point sprites clipped? |
| |
| RESOLVED: Point sprites are transformed as points, and standard point |
| clipping operations are performed. This can cause point sprites that |
| move off the edge of the screen to disappear abruptly, in the same way |
| that regular points do. As with any other primitive, standard |
| per-fragment clipping operations (scissoring, window ownership test) |
| still apply. |
| |
| New Procedures and Functions |
| |
| None |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, by |
| the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and |
| GetDoublev, and by the <target> parameter of TexEnvi, TexEnviv, |
| TexEnvf, TexEnvfv, GetTexEnviv, and GetTexEnvfv: |
| |
| POINT_SPRITE_ARB 0x8861 |
| |
| When the <target> parameter of TexEnvf, TexEnvfv, TexEnvi, TexEnviv, |
| GetTexEnvfv, or GetTexEnviv is POINT_SPRITE_ARB, then the value of |
| <pname> may be: |
| |
| COORD_REPLACE_ARB 0x8862 |
| |
| When the <target> and <pname> parameters of TexEnvf, TexEnvfv, |
| TexEnvi, or TexEnviv are POINT_SPRITE_ARB and COORD_REPLACE_ARB |
| respectively, then the value of <param> or the value pointed to by |
| <params> may be: |
| |
| FALSE |
| TRUE |
| |
| |
| Additions to Chapter 2 of the OpenGL 1.4 Specification (OpenGL Operation) |
| |
| None. |
| |
| Additions to Chapter 3 of the OpenGL 1.4 Specification (Rasterization) |
| |
| Insert the following paragraphs after the second paragraph of section |
| 3.3 (page 66): |
| |
| "Point sprites are enabled or disabled by calling Enable or Disable |
| with the symbolic constant POINT_SPRITE_ARB. The default state is for |
| point sprites to be disabled. When point sprites are enabled, the |
| state of the point antialiasing enable is ignored. |
| |
| The point sprite texture coordinate replacement mode is set with one |
| of the commands |
| |
| void TexEnv{if}(enum target, enum pname, T param) |
| void TexEnv{if}v(enum target, enum pname, const T *params) |
| |
| where target is POINT_SPRITE_ARB and pname is COORD_REPLACE_ARB. The |
| possible values for param are FALSE and TRUE. The default value for |
| each texture unit is for point sprite texture coordinate replacement |
| to be disabled." |
| |
| Replace the first two sentences of the second paragraph of section |
| 3.3.1 (page 67) with the following: |
| |
| "The effect of a point width other than 1.0 depends on the state of |
| point antialiasing and point sprites. If antialiasing and point |
| sprites are disabled, ..." |
| |
| Replace the first sentences of the fourth paragraph of section 3.3.1 |
| (page 68) with the following: |
| |
| "If antialiasing is enabled and point sprites are disabled, ..." |
| |
| Insert the following paragraphs at the end of section 3.3.1 (page |
| 70): |
| |
| "When point sprites are enabled, then point rasterization produces a |
| fragment for each framebuffer pixel whose center lies inside a square |
| centered at the point's (x_w, y_w), with side length equal to the |
| current point size. |
| |
| All fragments produced in rasterizing a point sprite are assigned the |
| same associated data, which are those of the vertex corresponding to |
| the point, with texture coordinates s, t, and r replaced with s/q, |
| t/q, and r/q, respectively. If q is less than or equal to zero, the |
| results are undefined. However, for each texture unit where |
| COORD_REPLACE_ARB is TRUE, these texture coordinates are replaced |
| with point sprite texture coordinates. The s coordinate varies |
| from 0 to 1 across the point horizontally left-to-right, while |
| the t coordinate varies from 0 to 1 vertically top-to-bottom. |
| The r and q coordinates are replaced with the constants 0 and 1, |
| respectively. |
| |
| The following formula is used to evaluate the s and t coordinates: |
| |
| s = 1/2 + (x_f + 1/2 - x_w) / size |
| t = 1/2 - (y_f + 1/2 - y_w) / size |
| |
| where size is the point's size, x_f and y_f are the (integral) window |
| coordinates of the fragment, and x_w and y_w are the exact, unrounded |
| window coordinates of the vertex for the point. |
| |
| The widths supported for point sprites must be a superset of those |
| supported for antialiased points. There is no requirement that these |
| widths must be equally spaced. If an unsupported width is requested, |
| the nearest supported width is used instead." |
| |
| Replace the text of section 3.3.2 (page 70) with the following: |
| |
| "The state required to control point rasterization consists of the |
| floating-point point width, three floating-point values specifying |
| the minimum and maximum point size and the point fade threshold size, |
| three floating-point values specifying the distance attenuation |
| coefficients, a bit indicating whether or not antialiasing is |
| enabled, a bit indicating whether or not point sprites are enabled, |
| and a bit for the point sprite texture coordinate replacement mode |
| for each texture unit." |
| |
| Replace the text of section 3.3.3 (page 70) with the following: |
| |
| "If MULTISAMPLE is enabled, and the value of SAMPLE_BUFFERS is one, |
| then points are rasterized using the following algorithm, regardless |
| of whether point antialiasing (POINT_SMOOTH) is enabled or disabled. |
| Point rasterization produces a fragment for each framebuffer pixel |
| with one or more sample points that intersect a region centered at |
| the point's (x_w, y_w). This region is a circle having diameter |
| equal to the current point width if POINT_SPRITE_ARB is disabled, or |
| a square with side equal to the current point width if |
| POINT_SPRITE_ARB is enabled. Coverage bits that correspond to sample |
| points that intersect the region are 1, other coverage bits are 0. |
| All data associated with each sample for the fragment are the data |
| associated with the point being rasterized, with the exception of |
| texture coordinates when POINT_SPRITE_ARB is enabled; these texture |
| coordinates are computed as described in section 3.3. |
| |
| Point size range and number of gradations are equivalent to those |
| supported for antialiased points when POINT_SPRITE_ARB is disabled. |
| The set of point sizes supported is equivalent to those for point |
| sprites without multisample when POINT_SPRITE_ARB is enabled." |
| |
| Additions to Chapter 4 of the OpenGL 1.4 Specification (Per-Fragment |
| Operations and the Frame Buffer) |
| |
| None. |
| |
| Additions to Chapter 5 of the OpenGL 1.4 Specification (Special |
| Functions) |
| |
| None. |
| |
| Additions to Chapter 6 of the OpenGL 1.4 Specification (State and |
| State Requests) |
| |
| None. |
| |
| Interactions with NV_point_sprite |
| |
| ARB_point_sprite is a functional subset of NV_point_sprite. |
| |
| The only functional difference between the extensions is that |
| NV_point_sprite provides the POINT_SPRITE_R_MODE_NV control. This mode |
| allows applications to specify how the r texture coordinates for point |
| sprites are replaced. The r coordinate can be replaced with the |
| corresponding s texture coordinate ("S" mode), left unchanged ("R" mode), |
| or replaced with the constant zero ("ZERO" mode). ARB_point_sprite always |
| replaces r texture coordiantes of point sprites with zero. |
| |
| Since ARB_point_sprite is functionally compatible with the default r mode |
| from NV_point_sprite, the two extensions can coexist nicely. Enumerant |
| values from NV_point_sprite are reused. |
| |
| If NV_point_sprite is supported, the language describing the replacement |
| of r coordinates for point sprites (forced to zero) is replaced with the |
| corresponding language from NV_point_sprite (controlled by |
| POINT_SPRITE_R_MODE_NV). |
| |
| |
| Errors |
| |
| None. |
| |
| New State |
| |
| (table 6.12, p. 220) |
| |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------- ---- ----------- ------------- ----------- ------ --------- |
| POINT_SPRITE_ARB B IsEnabled False point sprite enable 3.3 point/enable |
| |
| (table 6.17, p. 225) |
| |
| Get Value Type Get Command Initial Value Description Sec Attribute |
| --------- ---- ----------- ------------- ----------- ------ --------- |
| COORD_REPLACE_ARB 2* x B GetTexEnviv False coordinate replacement 3.3 point |
| enable |
| |
| Revision History |
| |
| Initially based on the NV_point_sprite specification but updated for |
| OpenGL 1.4. |
| |
| Rev. Date Author Changes |
| ---- -------- -------- -------------------------------------------- |
| 7 07/22/03 pbrown Marked point parameter issue resolved. |
| |
| 6 07/18/03 pbrown Removed POINT_SPRITE_R_MODE_CONTROL. |
| |
| Expanded on spec issue documenting the inversion |
| of the "t" texture coordinate relative to the |
| "y" window coordinate. Added issues on |
| interaction with PolygonMode, clipping, and |
| point parameters. Documented interaction with |
| NV_point_sprite. Removed now unneeded point |
| parameter interaction section and GLX protocol. |