Name ARB_point_parameters Name Strings GL_ARB_point_parameters Contact Michael Gold, NVIDIA (gold 'at' nvidia.com) Notice Copyright (c) 2000-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 Status Approved by the ARB, 21 June 2000. Version Revision Date: September 23, 2010 Version: 0.6 Based on: EXT_point_parameters $Date: 1997/08/21 21:26:36 $ $Revision: 1.6 $ Number ARB Extension #14 Dependencies OpenGL 1.0 is required. ARB_multisample affects the definition of this extension. The extension is written against the OpenGL 1.2.1 Specification. Overview This extension supports additional geometric characteristics of points. It can be used to render particles or tiny light sources, commonly referred to 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 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 PointSize. 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. IP Status None. Issues * Does point alpha modification affect the current color ? No. * Do we need a special function GetPointParameterfvARB, or get by with GetFloat ? GetFloat is sufficient. * 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 overridden, 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. POINT_FADE_ALPHA_CLAMP_ARB When the derived point size is larger than the threshold size defined by the POINT_FADE_THRESHOLD_SIZE_ARB 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 POINT_FADE_ALPHA_CLAMP_ARB new parameter. New Procedures and Functions void PointParameterfARB(enum pname, float param); void PointParameterfvARB(enum pname, const float *params); New Tokens Accepted by the parameter of PointParameterfARB, and the of Get: POINT_SIZE_MIN_ARB POINT_SIZE_MAX_ARB POINT_FADE_THRESHOLD_SIZE_ARB Accepted by the parameter of PointParameterfvARB, and the of Get: POINT_SIZE_MIN_ARB 0x8126 POINT_SIZE_MAX_ARB 0x8127 POINT_FADE_THRESHOLD_SIZE_ARB 0x8128 POINT_DISTANCE_ATTENUATION_ARB 0x8129 Additions to Chapter 2 of the OpenGL 1.2.1 Specification (OpenGL Operation) None Additions to Chapter 3 of the OpenGL 1.2.1 Specification (Rasterization) In section 3.3, the following is inserted after the description of PointSize: The point size is multiplied with a distance attenuation factor and clamped as follows: derived_size = Clamp(size * sqrt(dist_atten(dist))) where dist_atten is specified as 1 dist_atten(d) = ------------------- a + b * d + c * d^2 and 'd' is the eye-coordinate distance from the eye, (0, 0, 0, 1) in eye coordinates, to the vertex. The derived point size is clamped to a given range, and then clamped to the implementation-dependent point size range. If multisampling is enabled, an implementation may optionally fade the point alpha (section 3.12) instead of allowing the size to go below a given threshold. In this case, the diameter of the rasterized point is derived_size derived_size >= threshold diameter = threshold Otherwise and the fade factor is computed as follows: 1 derived_size >= threshold fade = (derived_size/threshold)^2 Otherwise The distance attenuation function coefficients, 'a', 'b', and 'c', the bounds of the clamp, and the point fade 'threshold', are specified with void PointParameterfARB( enum pname, float param ); void PointParameterfvARB( enum pname, const float *params ); If is POINT_SIZE_MIN_ARB or POINT_SIZE_MAX_ARB, then specifies, or points to the lower or upper bound respectively on the derived point size. If the lower bound is greater than the upper bound, the resulting point size is undefined. If is POINT_DISTANCE_ATTENUATION_ARB, then points to the coefficients 'a', 'b', and 'c'. If is POINT_FADE_THRESHOLD_SIZE_ARB, specifies, or points to the point fade threshold. This extension doesn't change the feedback or selection behavior of points. In section 3.11, the word "Finally" is removed from the first sentence. Add the following after section 3.11. Section 3.12 Multisample Point Fade If multisampling is enabled and the rasterized fragment results from a point primitive, then the computed fade factor is applied to the fragment. In RGBA mode, the fade factor is multiplied by the fragment's alpha (A) value to yield a final alpha value. In color index mode, the fade factor has no effect. Additions to Chapter 4 of the OpenGL 1.2.1 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the OpenGL 1.2.1 Specification (Special Functions) None Additions to Chapter 6 of the OpenGL 1.2.1 Specification (State and State Requests) None Additions to Appendix A of the OpenGL 1.2.1 Specification (Invariance) None Additions to the GLX / WGL / AGL Specifications None GLX Protocol Two new GL rendering commands are added. The following commands are sent to the server as part of a glXRender request: PointParameterfARB 2 8+4*n rendering command length 2 2065 rendering command opcode 4 ENUM pname 0x8126 n=1 POINT_SIZE_MIN_ARB 0x8127 n=1 POINT_SIZE_MAX_ARB 0x8128 n=1 POINT_FADE_THRESHOLD_SIZE_ARB 4 FLOAT32 param PointParameterfvARB 2 8+4*n rendering command length 2 2066 rendering command opcode 4 ENUM pname 0x8126 n=1 POINT_SIZE_MIN_ARB 0x8127 n=1 POINT_SIZE_MAX_ARB 0x8128 n=1 POINT_FADE_THRESHOLD_SIZE_ARB 0x8129 n=3 POINT_DISTANCE_ATTENUATION_ARB 4*n LISTofFLOAT32 params Dependencies on ARB_multisample If ARB_multisample is not implemented, then the references to multisample points are invalid, and should be ignored. Errors INVALID_ENUM is generated if PointParameterfARB parameter is not POINT_SIZE_MIN_ARB, POINT_SIZE_MAX_ARB, or POINT_FADE_THRESHOLD_SIZE_ARB. INVALID_ENUM is generated if PointParameterfvARB parameter is not POINT_SIZE_MIN_ARB, POINT_SIZE_MAX_ARB, POINT_FADE_THRESHOLD_SIZE_ARB, or POINT_DISTANCE_ATTENUATION_ARB INVALID_VALUE is generated when values are out of range according to: valid range -------- ----------- POINT_SIZE_MIN_ARB >= 0 POINT_SIZE_MAX_ARB >= 0 POINT_FADE_THRESHOLD_SIZE_ARB >= 0 New State (table 6.11, p. 201) Initial Get Value Type Get Command Value Description Sec. Attribute --------- ---- ----------- ------- ----------- ---- --------- POINT_SIZE_MIN_ARB R+ GetFloatv 0.0 Attenuated 3.3 point Min point size POINT_SIZE_MAX_ARB R+ GetFloatv M Attenuated 3.3 point Max point size POINT_FADE_THRESHOLD_SIZE_ARB R+ GetFloatv 1.0 Threshold 3.3 point for alpha attenuation POINT_DISTANCE_ATTENUATION_ARB 3xR GetFloatv (1.0,0.0,0.0) 3.3 point Attenuation coefficients M is the larger of the max antialiased and non antialiased point sizes. New Implementation Dependent State None Revision History 11/09/1999 0.1 - First ARB draft based on the original SGI and EXT drafts. 12/07/1999 0.2 - clarified behavior when POINT_SIZE_MIN exceeds POINT_SIZE_MAX - clarified when the point size is clamped to the supported range - removed issues from "Errors" section - fixed various typos - Updated to new extension template - added GLX protocol 04/20/2000 0.3 - rewritten to fit within the context of the 1.2 specification - added language describing where the fade alpha is applied. - added language which indicates that some implementations may not implement POINT_FADE_THRESHOLD_SIZE_ARB 06/20/2000 0.4 - removed alternate behavior for fade alpha, since it is optional - added new section describing fade alpha application 03/12/2002 0.5 - added GLX protocol for PointParameterfARB and assigned ropcodes 09/23/2010 0.6 (pbrown) - add "const" qualifier to argument to PointParameterfvARB