Name

    ARB_color_buffer_float

Name Strings

    GL_ARB_color_buffer_float
    WGL_ARB_pixel_format_float
    GLX_ARB_fbconfig_float

Contributors

    Pat Brown, NVIDIA
    James Jones, NVIDIA
    Jon Leech
    Rob Mace, ATI
    V Moya
    Brian Paul, Tungsten Graphics

Contact

    Dale Kirkland, NVIDIA (dkirkland 'at' nvidia.com)

Notice

    Copyright (c) 2004-2013 The Khronos Group Inc. Copyright terms at
        http://www.khronos.org/registry/speccopyright.html

Status

    Complete. Approved by the ARB on October 22, 2004.

Version

    Based on the ATI_pixel_format_float extension, version 5
    Enables based on work by Pat Brown from the color_clamp_control proposal

    Last Modified Date:  April 1, 2015
    Version:             9

Number

    ARB Extension #39

Dependencies

    This extension is written against the OpenGL 2.0 Specification
    but will work with the OpenGL 1.5 Specification.

    WGL_ARB_pixel_format is required.

    This extension interacts with ARB_fragment_program.

    This extension interacts with ARB_fragment_shader.

    This extension interacts with NV_float_buffer.

    This extension interacts with ATI_pixel_format_float.

Overview

    The standard OpenGL pipeline is based on a fixed-point pipeline.
    While color components are nominally floating-point values in the
    pipeline, components are frequently clamped to the range [0,1] to
    accomodate the fixed-point color buffer representation and allow
    for fixed-point computational hardware.

    This extension adds pixel formats or visuals with floating-point
    RGBA color components and controls for clamping of color
    components within the pipeline.

    For a floating-point RGBA pixel format, the size of each float
    components is specified using the same attributes that are used
    for defining the size of fixed-point components.  32-bit
    floating-point components are in the standard IEEE float format.
    16-bit floating-point components have 1 sign bit, 5 exponent bits,
    and 10 mantissa bits.

    Clamping control provides a way to disable certain color clamps
    and allow programs, and the fixed-function pipeline, to deal in
    unclamped colors.  There are controls to modify clamping of vertex
    colors, clamping of fragment colors throughout the pipeline, and
    for pixel return data.

    The default state for fragment clamping is "FIXED_ONLY", which
    has the behavior of clamping colors for fixed-point color buffers
    and not clamping colors for floating-pont color buffers.

    Vertex colors are clamped by default.


IP Status

    SGI owns US Patent #6,650,327, issued November 18, 2003. SGI
    believes this patent contains necessary IP for graphics systems
    implementing floating point (FP) rasterization and FP framebuffer
    capabilities.

    SGI will not grant the ARB royalty-free use of this IP for use in
    OpenGL, but will discuss licensing on RAND terms, on an individual
    basis with companies wishing to use this IP in the context of
    conformant OpenGL implementations. SGI does not plan to make any
    special exemption for open source implementations.

    Contact Doug Crisman at SGI Legal for the complete IP disclosure.

Issues

    1. How is this extension different from the ATI_pixel_format_float
       extension?

       RESOLVED:  By default, this extension behaves like the
       ATI_pixel_format_float, but also adds additional controls for
       color clamping.

    2. Should the clamp controls be automatically inferred based on
       the format of the color buffer or textures used?

       RESOLVED:  Explicit controls should be supported -- this allows
       the use of floating-point buffers to emulate fixed-point
       operation, and allows for operating on unclamped values even
       when rendering to a fixed-point framebuffer.

       However, a default clamping mode called "FIXED_ONLY" is defined
       that enables clamping only when rendering to a fixed-point color
       buffer, which is the default for fragment processing.  This is
       done to maintain compatibility with previous extensions
       (ATI_pixel_format_float), and to allow applications to switch
       between fixed- and floating-point color buffers without having
       to change the clamping mode on each switch.

    3. How does the clamping control affect the blending equation?

       RESOLVED:  For fixed-point color buffers, the inputs and the
       result of the blending equation are clamped.  For floating-point
       color buffers, no clamping occurs.

    4. Should the requirements for the representable range of color
       components be increased?

       RESOLVED:  No.  Such a spec change would be complicated, since
       the required precision may vary based on color buffer precision.
       Despite the fact that there is no spec requirement, GL
       implementations should have at least as much precision/range in
       their colors as can be found in the framebuffer.

    5. Should the vertex color clamping control apply to RasterPos?
       WindowPos?

       RESOLVED:  Yes to both.  RasterPos is processed just like a
       vertex, so the vertex color clamping control applies
       automatically.  The WindowPos language in the OpenGL 2.0
       specification explicitly refers to color clamping.  Instead,
       we modify the language to perform normal processing, but with
       lighting forced off.  This will result in the color clamping
       logic applying.

    6. What control should apply to DrawPixels RGBA components?

       RESOLVED:  The fragment color clamp control.

    7. Should this extension modify the clamping of the texture
       environment color components?  TEXTURE_ENV_COLOR components
       are currently specified to be clamped to [0,1] when TexEnv is
       called.

       RESOLVED:  Yes.  The texture environment color is no longer
       clamped when specified.  If fragment color clamping is enabled,
       it will be clamped to [0,1] on use.

    8. In texture environment application, should color components used
       as an interpolation factor (e.g., alpha) be clamped to [0,1]?

       RESOLVED:  No.  For interpolation-type blends, the weighting
       factor is normally in the range [0,1].  But the math is well-
       defined in the cases where it falls outside this range.  When
       fragment color clamping is enabled, all sources are clamped to
       [0,1], so this is not an issue.

   9. In the COMBINE texture environment mode, should any of the
       source argument operands be clamped to [0,1] even when fragment
       clamping is disabled?  For example, ONE_MINUS_* mappings are
       simple in a fixed-point pipeline are simple, but more
       complicated in a floating-point one.

       RESOLVED:  No.  The math behind ONE_MINUS_* is well-defined for
       all inputs.

   10. Should the clamping controls affect the texture comparison mode
       for shadow mapping?

       RESOLVED:  No.  The r coordinate should still be clamped to
       [0,1] to match the depth texture.  The result of the
       comparison will naturally lie in the range [0,1].

   11. Should the clamping controls affect the result of color sum?

       RESOLVED:  Yes.

   12. Should the clamping controls affect the computed fog factor?

       RESOLVED:  No.  The fog factor is not a color -- it is used to
       blend between the fragment color and the fog color.  The factor
       should always be clamped to [0,1].

   13. Should this extension modify the clamping of the fog color
       components?  FOG_COLOR components are specified to be clamped
       to [0,1] when Fogfv is called.

       RESOLVED:  Yes.  Fog color components are no longer clamped
       when specified, but will be clamped when fog is applied if
       fragment color clamping is enabled.

   14. How does this extension interact with antialiasing application
       (Section 3.12 of the OpenGL 2.0 spec)?

       RESOLVED:  Multiply floating-point alpha by coverage, even if
       the alpha value is not being used as opacity.  If applications
       don't want this multiplication, they should not render
       antialiased primitives. No spec language changes are needed
       here.

   15. How does this extension interact with multisample point fade
       (Section 3.13 of the OpenGL 2.0 spec)?

       RESOLVED:  Multiply floating-point alpha by the fade factor,
       even if the alpha value is not being used as opacity.  If
       applications don't want this multiplication, they should not
       use multisample point fade.  No spec language changes are
       needed here.

   16. Should this extension modify the clamping of the alpha test
       reference value?

       RESOLVED:  Yes.  The reference value is not clamped when
       specified, by may be clamped when it is used.

   17. Should this extension modify the clamping of the constant blend
       color components?

       RESOLVED:  Yes.  The blend color is not clamped when specified.
       When rendering to a fixed-point framebuffer, the blend color
       will be clamped as part of the blending operation.

   18. Should this extension modify the clamping of clear colors?

       RESOLVED:  Yes.  The clear color is not clamped when specified.
       When clearing color buffers, the clear color is converted to
       the format of the color buffer.

   19. Should we provide a control to disable implicit clamping of
       ReadPixels data?  If so, how should it be specified?

       RESOLVED:  Yes.  It is explicitely controlled by the target
       CLAMP_READ_COLOR_ARB of the ClampColorARB function and clamps
       the color during the final conversion.

   20. How does this extension interact with CopyPixels?

       RESOLVED: It has no special interaction.  CopyPixels is specified
       as roughly a ReadPixels/DrawPixels sequence, but the read color
       clamp modified by this specification occur during final
       conversion and therefore would not apply. The fragment color
       clamp does affect the DrawPixels portion of the operation,
       however.  The net result is that calling CopyPixels with a
       floating-point framebuffer will clamp color components if
       fragment color clamping is enabled.

   21. Should these clamping controls interact with PushAttrib and
       PopAttrib? If so, what group should they belong to?

       RESOLVED:  For consistency, yes.  Historically, all enables are
       pushed and popped with both the enable bit and a second bit
       corresponding to the function performed by the enable.  The
       present spec calls for pushing the vertex color clamp with the
       lighting group and the fragment and read color clamp with the
       color-buffer group (for lack of a better choice).

   22. Should this extension require a floating-point color buffer
       or texture?

       RESOLVED:  No.  This extension provides the ability to pass an
       unclamped color between vertex and fragment programs/shaders,
       which may be useful. This was possible prior to this extension,
       by passing the color data as texture coordinates or named
       varying variables (for vertex/fragment shaders).

   23. Does this extension interact with the ARB_vertex_program or
       ARB_vertex_shader extensions?

       RESOLVED:  Only in the most trivial way.  Both of these
       extensions refer to the color clamping logic (Section 2.14.6
       in the OpenGL 2.0 specification).  This extension modifies that
       logic to be under control of the CLAMP_VERTEX_COLOR_ARB enable.
       It follows that this enable also controls the clamping of vertex
       program or vertex shader results.

   24. Does this extension interact with the ARB_fragment_program or
       ARB_fragment_shader extensions?

       RESOLVED:  Yes.  The only interaction is that the fragment color
       clamp enable determines if the final color(s) produced by the
       fragment program/shader has its components clamped to [0,1].

       However, the fragment color clamp enable affects only the final
       result; it does NOT affect any computations performed during
       program execution. Note that the same clamping can be done
       explicitly in a fragment program or shader.
       ARB_fragment_program provides the "_SAT" opcode suffix to clamp
       instruction results to [0,1].

   25. Should this extension modify the clamping of the texture border
       color components?

       RESOLVED:  Not by this extension.  See the ARB_texture_float
       extension.

   26. When using vertex and fragment programs/shaders, should color
       clamping be specified in the shader instead?

       RESOLVED:  No.  All the existing program/shader extensions call
       for the color outputs to be clamped to [0,1], except that
       previous floating-point color buffer extensions disabled the
       clamp of fragment program/shader outputs.

       While it would be straightforward to have required that vertex
       or fragment programs manually clamp their outputs if desired,
       adding such a requirement at this point would pose compatibility
       issues.  It would probably require introduction of a special
       directive to indicate that colors are unclamped.

       If a GL implementation internally performs color clamping in a
       vertex or fragment program, it may be necessary to recompile the
       program if the corresponding clamp enable changes.

   27. If certain colors in the OpenGL state vector were clamped in
       previous versions of the spec, but now have the clamping
       removed, do queries need to return clamped values for
       compatibility with older GL versions? Should we add new query
       tokens to return unclamped values?

       RESOLVED: To minimize impact on this specification while allowing
       for compatibility with older GL versions, the values of the
       vertex/fragment color clamp enables should affect queries of such
       state.  If the corresponding color clamp is enabled, components
       will be clamped to [0,1] when returned.  Since color clamping is
       enabled by default for fixed-point color buffers, the removal of
       the clamps will not be observable by applications unless they
       disable one or both clamps or choose a floating-point buffer
       (which will not happen for "old" applications).

       Note that this spec relaxes the clamp on the current raster
       color, but we don't need to add a clamp on the corresponding
       query.  The current raster color is clamped when the GL computes
       it, unless vertex color clamping is disabled by the application.

   28. At what precision should alpha test be carried out?  At the
       precision of the framebuffer?  Or some other unspecified
       precision?  What happens if you have a framebuffer with no
       alpha?

       RESOLVED: No specific precision requirements are added, except
       that the reference value used in the alpha test should be
       converted to the same precision and in the same manner as the
       fragment's alpha. This requirement is intended to avoid cases
       where the act of converting the alpha value of a fragment to
       fixed-point (or lower-precision floating-point) might change the
       result of the test.

   29. How does this extension interact with accumulation buffers?

       RESOLVED: This extension does not modify the nature of
       accumulation buffers.  Adding semantics for floating-point
       accumulation buffers is left for a possible future extension.
       The clamp on the RETURN operation is controlled by the fragment
       color clamp enable.

   30. How does this extension interact with OpenGL FEEDBACK mode?

       RESOLVED: OpenGL FEEDBACK mode returns colors after clipping,
       which is done after the vertex color clamping.  Therefore, the
       colors returned will be clamped to [0,1] if and only if vertex
       color clamping is enabled.  No spec language changes are
       necessary.

   31. Should we relax the language in Section 2.14.9 (Final Color
       Processing) to not require conversion to fixed-point?

       RESOLVED: Adding floating-point vertex colors requires that
       this language be modified.  Even for the clamped case, it seems
       reasonable for implementations to simply clamp a floating-point
       value to [0,1] without converting to a fixed-point
       representation.  This specification makes converting colors to
       fixed-point optional.  Colors will obviously still be converted
       to fixed-point eventually if the framebuffer is fixed-point.

   32. What should be done about the "preserving the bits" requirement
       for Color*{ub,us,ui} commands in Section 2.14.9?

       RESOLVED: If colors are represented as floats internally and
       the frame-buffer is fixed-point, do we require that the MSBs of
       fixed-point colors that don't go through lighting, and
       non-trivial interpolation, or any non-trivial fragment operations
       show up in the MSBs of the framebuffer?

   33. How does this extension interact with multisample
       ALPHA_TO_COVERAGE, where an alpha value expected to be in the
       range [0,1] is turned into a set of coverage bits?

       UNRESOLVED: For the purposes of generating sample coverage from
       fragment alpha, the alpha values are effectively clamped to
       [0,1].  Negative alpha values correspond to no coverage; alpha
       values greater than one correspond to full coverage.

   34. What happens if there are no color buffers in the framebuffer
       and a clamp control is set to FIXED_ONLY?

       RESOLVED: The present language treats a zero-bit color buffer
       as fixed-point.

   35. Should the clamping of fragment shader output gl_FragData[n]
       be controlled by the fragment color clamp.

       RESOLVED: Since the destination of the FragData is a color
       buffer, the fragment color clamp control should apply.

   36. Should logical operations be disabled for floating-point
       color buffers.

       RESOLVED:  Yes.  This matches the behavior in the ATI
       specification.

   37. Is it expected that a floating-point color read from a
       floating-point color buffer exactly match a floating-point
       color in a fragment?  Will the alpha test of GL_EQUAL
       be expected to work?

       RESOLVED: This behavior is not required by this extension.
       Floating-point data may have different precision at different
       parts of the pipeline.

   38. How does this extension handle the case where a floating-point
       and a fixed-point buffer exists?

       RESOLVED: For vertex colors, clamping occurs if any color
       buffer are floating point.   Fragment colors are handled
       based on the format (fixed or float) of the color buffer
       that they will be drawn to.

New Procedures and Functions

    void ClampColorARB(enum target, enum clamp);

New Tokens

    Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev:

        RGBA_FLOAT_MODE_ARB                     0x8820

    Accepted by the <target> parameter of ClampColorARB and the <pname>
    parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev.

        CLAMP_VERTEX_COLOR_ARB                  0x891A
        CLAMP_FRAGMENT_COLOR_ARB                0x891B
        CLAMP_READ_COLOR_ARB                    0x891C

    Accepted by the <clamp> parameter of ClampColorARB.

        FIXED_ONLY_ARB                          0x891D
        FALSE
        TRUE

    Accepted as a value in the <piAttribIList> and <pfAttribFList>
    parameter arrays of wglChoosePixelFormatARB, and returned in the
    <piValues> parameter array of wglGetPixelFormatAttribivARB, and the
    <pfValues> parameter array of wglGetPixelFormatAttribfvARB:

        WGL_TYPE_RGBA_FLOAT_ARB                 0x21A0

    Accepted as values of the <render_type> arguments in the
    glXCreateNewContext and glXCreateContext functions

        GLX_RGBA_FLOAT_TYPE_ARB                 0x20B9

    Accepted as a bit set in the GLX_RENDER_TYPE variable

        GLX_RGBA_FLOAT_BIT_ARB                  0x00000004

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

    Add a new Section 2.1.2, (p. 6):

    2.1.2  16-Bit Floating-Point Numbers

    A 16-bit floating-point number has a 1-bit sign (S), a 5-bit
    exponent (E), and a 10-bit mantissa (M).  The value of a 16-bit
    floating-point number is determined by the following:

        (-1)^S * 0.0,                        if E == 0 and M == 0,
        (-1)^S * 2^-14 * (M / 2^10),         if E == 0 and M != 0,
        (-1)^S * 2^(E-15) * (1 + M/2^10),    if 0 < E < 31,
        (-1)^S * INF,                        if E == 31 and M == 0, or
        NaN,                                 if E == 31 and M != 0,

    where

        S = floor((N mod 65536) / 32768),
        E = floor((N mod 32768) / 1024), and
        M = N mod 1024.

    Implementations are also allowed to use any of the following
    alternative encodings:

        (-1)^S * 0.0,                        if E == 0 and M != 0,
        (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M == 0, or
        (-1)^S * 2^(E-15) * (1 + M/2^10),    if E == 31 and M != 0,

    Any representable 16-bit floating-point value is legal as input
    to a GL command that accepts 16-bit floating-point data.  The
    result of providing a value that is not a floating-point number
    (such as infinity or NaN) to such a command is unspecified, but
    must not lead to GL interruption or termination.  Providing a
    denormalized number or negative zero to GL must yield predictable
    results.

    Modify Section 2.13 (Current Raster Position), p. 54

    (modify last paragraph on p. 55) Lighting, texture coordinate
    generation and transformation, and clipping are not performed by
    the WindowPos functions. Instead, in RGBA mode, the current raster
    color and secondary color are obtained from the current color and
    secondary color, respectively.  If vertex color clamping is enable,
    the current raster color and secondary color are clamped to [0, 1].
    In color index mode, the current raster color index is set to the
    current color index.  The current raster texture coordinates are
    set to the current texture coordinates, and the valid bit is set.

    Modify Section 2.14 (Colors and Coloring), p. 57

    (modify last paragraph on p.57) ... After lighting, RGBA colors are
    optionally clamped to the range [0,1]. ...

    Modify Section 2.14.6 (Clamping or Masking), p. 69

    (modify first and second paragraphs of section) When the GL is in
    RGBA mode and vertex color clamping is enabled, all components of
    both primary and secondary colors are clamped to the range [0,1]
    after lighting. If color clamping is disabled, the primary and
    secondary colors are unmodified. Vertex color clamping is controlled
    by calling

        void ClampColorARB(enum target, enum clamp)

    with a <target> set to CLAMP_VERTEX_COLOR_ARB.  If <clamp> is TRUE,
    vertex color clamping is enabled; if <clamp> is FALSE, vertex color
    clamping is disabled.  If <clamp> is FIXED_ONLY_ARB, vertex color
    clamping is enabled if all enabled color buffers have fixed-point
    components.

    For a color index, the index is first converted to...

    (add paragraph at the end of the section) The state required for
    color clamping is an enumerant.  Vertex color clamping is initially
    TRUE.

    Replace Section 2.14.9 (Final Color Processing), p. 71

    In RGBA mode with vertex color clamping disabled, the floating-
    point RGBA components are not modified.

    In RGBA mode with vertex clamping enabled, each color component
    (already clamped to [0,1]) may be converted (by rounding to nearest)
    to a fixed-point value with m bits. We assume that the fixed-point
    representation used represents each value k/(2^m - 1), with k in the
    set {0, 1, . . . , 2^m - 1}, as k (e.g. 1.0 is represented in binary
    as a string of all ones). m must be at least as large as the number
    of bits in the corresponding component of the framebuffer. m must be
    at least 2 for A if the framebuffer does not contain an A component,
    or if there is only 1 bit of A in the framebuffer.  GL
    implementations are not required to convert clamped color components
    to fixed-point.

    Because a number of the form k/(2^m - 1) may not be represented
    exactly as a limited-precision floating-point quantity, we place a
    further requirement on the fixed-point conversion of RGBA
    components. Suppose that lighting is disabled, the color associated
    with a vertex has not been clipped, and one of Colorub, Colorus, or
    Colorui was used to specify that color. When these conditions are
    satisfied, an RGBA component must convert to a value that matches
    the component as specified in the Color command: if m is less than
    the number of bits b with which the component was specified, then
    the converted value must equal the most significant m bits of the
    specified value; otherwise, the most significant b bits of the
    converted value must equal the specified value.

    In color index mode, a color index is converted (by rounding to
    nearest) to a fixed-point value with at least as many bits as there
    are in the color index portion of the framebuffer.


Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization)

    Modify Section 3.6.4 (Rasterization of Pixel Rectangles), p. 126

    (modify next-to-last paragraph, p.136, "Final Conversion") ... For
    RGBA components, if fragment color clamping is enabled, each
    element is clamped to [0,1], and may be converted to fixed-point
    according to the rules given in section 2.14.9 (Final Color
    Processing).  If fragment color clamping is disabled, RGBA
    components are unmodified.  Fragment color clamping is controlled
    using ClampColorARB, as described in section 2.14.6, with a
    <target> of CLAMP_FRAGMENT_COLOR_ARB.

    (add new paragraph at the end of "Final Conversion", p.137) The
    state required for fragment color clamping is an enumerant.
    Fragment color clamping is initially set to FIXED_ONLY_ARB.

    Modify Section 3.8.13 (Texture Environments and Functions), p.182

    (modify third paragraph, p. 183, removing clamping language)
     ...TEXTURE_ENV_COLOR is set to an RGBA color by providing four
    single-precision floating-point values.  If integers are provided
    for TEXTURE ENV COLOR, then they are converted to floating-point
    as specified in table 2.9 for signed integers.

    (replace the sixth paragraph of p. 183) If fragment color clamping
    is enabled, all of these color values, including the results, are
    clamped to the range [0,1].  If fragment color clamping is
    disabled, the values are not clamped.  The texture functions are
    specified in tables 3.22, 3.23, and 3.24.

    (modify seventh paragraph of p. 183) ... ALPHA_SCALE, respectively.
    If fragment color clamping is enabled, the arguments and results
    used in table 3.24 are clamped to [0,1].  Otherwise, the results
    are unmodified.

    Modify Section 3.9 (Color Sum), p. 191

    (modify second paragraph) ... the A component of c_sec is unused.
    If color sum is disabled, then c_pri is assigned to c.  The
    components of c are then clamped to the range [0,1] if and only
    if fragment color clamping is enabled.

    Modify Section 3.10 (Fog), p. 191

    (modify fourth paragraph, p. 192, removing clamping language) ...If
    these are not floating-point values, then they are converted to
    floating-point using the conversion given in table 2.9 for signed
    integers.  If fragment color clamping is enabled, the components of
    C_r and C_f and the result C are clamped to the range [0,1] before
    the fog blend is performed.

    Modify Section 3.11.2 (Shader Execution), p. 194

    (modify Shader Inputs, first paragraph, p. 196) The built-in
    variables gl_Color and gl_SecondaryColor hold the R, G, B, and A
    components, respectively, of the fragment color and secondary
    color. If the primary color or the secondary color components are
    represented by the GL as fixed-point values, they undergo an
    implied conversion to floating-point.  This conversion must leave
    the values 0 and 1 invariant. Floating-point color components
    (resulting from a disabled vertex color clamp) are unmodified.

    (modify Shader Outputs, first paragraph, p. 196) ... These are
    gl_FragColor, gl_FragData[n], and gl_FragDepth.  If fragment
    clamping is enabled, the final fragment color values or the final
    fragment data values written by a fragment shader are clamped to
    the range [0, 1] and then may be converted to fixed-point as
    described in section 2.14.9.  If fragment clamping is disabled,
    the final fragment color values or the final fragment data values
    are not modified.  The final fragment depth...

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

    Modify Chapter 4 Introduction, (p. 198)

    (modify third paragraph, p. 198)  Color buffers consist of either
    unsigned integer color indices, R, G, B and optionally A unsigned
    integer values, or R, G, B, and optionally A floating-point values.
    The number of bitplanes...

    Modify Section 4.1.3 (Multisample Fragment Operations), p. 200

    (modify last paragraph, p. 200) ...and all 0's corresponding to all
    alpha values being 0.  The alpha values used to generate a coverage
    value are clamped to the range [0,1]. It is also intended ...

    Modify Section 4.1.5 (Alpha Test), p. 201

    (modify first paragraph of section, deleting clamping of
     reference value)  ... The test is controlled with

       void AlphaFunc(enum func, float ref);

    func is a symbolic constant indicating the alpha test function;
    ref is a reference value.  When performing the alpha test, the GL
    will convert the reference value to the same representation as the
    the fragment's alpha value (floating-point or fixed-point).
    For fixed-point, the reference value is converted according to the
    rules given for an A component in section 2.14.9 and the fragment's
    alpha value is rounded to the nearest integer.  The possible ...

    Modify Section 4.1.8 (Blending), p. 205

    (modify first paragraph, p. 206) Source and destination values are
    combined according to the blend equation, quadruplets of source and
    destination weighting factors determined by the blend functions, and
    a constant blend color to obtain a new set of R, G, B, and A values,
    as described below.

    If the color buffer is fixed-point, the components of the source
    and destination values and blend factors are clamped to [0, 1]
    prior to evaluating the blend equation, the components of the
    blending result are clamped to [0,1] and converted to fixed-
    point values in the manner described in section 2.14.9. If the
    color buffer is floating-point, no clamping occurs.  The
    resulting four values are sent to the next operation.

    (modify fifth paragraph, p. 206) Fixed-point destination
    (framebuffer) components are taken to be fixed-point values
    represented according to the scheme given in section 2.14.9
    (Final Color Processing).  Constant color components, floating-
    point destination components, and source (fragment) components are
    taken to be floating point values. If source components are
    represented internally by the GL as either fixed-point values they
    are also interepreted according to section 2.14.9.

    (modify Blend Color section removing the clamp, p. 209) The
    constant color C_c to be used in blending is specified with the
    command

       void BlendColor(float red, float green, float blue, float alpha);

    The constant color can be used in both the source and destination
    blending functions.

    Replace Section 4.1.9 (Dithering), p. 209

    Dithering selects between two representable color values or indices.
    A representable value is a value that has an exact representation in
    the color buffer.  In RGBA mode dithering selects, for each color
    component, either the most positive representable color value (for
    that particular color component) that is less than or equal to the
    incoming color component value, c, or the most negative
    representable color value that is greater than or equal to c.  The
    selection may depend on the x_w and y_w coordinates of the pixel, as
    well as on the exact value of c.  If one of the two values does not
    exist, then the selection defaults to the other value.

    In color index mode dithering selects either the largest
    representable index that is less than or equal to the incoming
    color value, c, or the smallest representable index that is greater
    than or equal to c.  If one of the two indices does not exist, then
    the selection defaults to the other value.

    Many dithering selection algorithms are possible, but an individual
    selection must depend only on the incoming color index or component
    value and the fragment's x and y window coordinates.  If dithering
    is disabled, then each incoming color component c is replaced with
    the most positive representable color value (for that particular
    component) that is less than or equal to c, or by the most negative
    representable value, if no representable value is less than or equal
    to c; a color index is rounded to the nearest representable index
    value.

    Dithering is enabled with Enable and disabled with Disable using the
    symbolic constant DITHER.  The state required is thus a single bit.
    Initially dithering is enabled.

    Section 4.1.10 (Logical Operation), p. 210

    (insert after the first sentence, p. 210)  Logical operation has no
    effect on a floating-point destination color buffer.  However, if
    COLOR_LOGIC_OP is enabled, blending is still disabled.

    Modify Section 4.2.3 (Clearing the Buffers), p. 215

    (modify second paragraph, p. 216, removing clamp of clear color)

       void ClearColor(float r, float g, float b, float a);

    sets the clear value for the color buffers in RGBA mode.

    (add to the end of first partial paragraph, p. 217) ... then a
    Clear directed at that buffer has no effect.  Fixed-point RGBA
    color buffers are cleared to a color values derived by taking the
    clear color, clamping to [0,1], and converting to fixed-point
    according to the rules of section 2.14.9.

    Modify Section 4.2.4 (The Accumulation Buffer), p. 217

    (modify second paragraph in section, p. 217) ... Using ACCUM
    obtains R, G, B, and A components from the color buffer currently
    selected for reading (section 4.3.2). If the color buffer is
    fixed-point, each component is considered as a fixed-point value
    in [0,1] (see section 2.14.9) and is converted to floating-point.
    Each result is then multiplied ...

    (modify second paragraph on p. 218) The RETURN operation takes
    each color value from the accumulation buffer and multiplies each
    of the R, G, B, and A components by <value>.  If fragment color
    clamping is enabled, the results are then clamped to the range
    [0,1]. ...

    Modify Section 4.3.2 (Reading Pixels), p. 219

    (modify paragraph at top of page, p. 222)  ... For a fixed-point
    color buffer, each element is taken to be a fixed-point value in
    [0, 1] with m bits, where m is the number of bits in the
    corresponding color component of the selected buffer (see
    section 2.14.9).  For floating-point color buffer, the elements
    are unmodified.

    (modify second paragraph of "Final Conversion", p. 222) For an
    RGBA color, if <type> is not FLOAT, or if the CLAMP_READ_COLOR_ARB
    is TRUE, or CLAMP_READ_COLOR_ARB is FIXED_ONLY_ARB and the selected
    color buffer is a fixed-point buffer, each component is first
    clamped to [0,1].  Then the appropriate conversion...


Additions to Chapter 5 of the OpenGL 2.0 Specification (Special Functions)

    None

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

    Modify Section 6.1.2, Data Conversions, p. 245

    (add new paragraph at the end of the section, p. 245) If fragment
    color clamping is enabled, querying of the texture border color,
    texture environment color, fog color, alpha test reference value,
    blend color, and RGBA clear color will clamp the corresponding
    state values to [0,1] before returning them.  This behavior
    provides compatibility with previous versions of the GL that
    clamped these values when specified.

Additions to Chapter 1 of the GLX 1.3 Specification (Overview)

    None

Additions to Chapter 2 of the GLX 1.3 Specification (GLX Operation)

    None

Additions to Chapter 3 of the GLX 1.3 Specification (Functions and
Errors)

    Replace Section 3.3.3 (p.12) Paragraph 4 to:

    The attribute GLX_RENDER_TYPE has as its value a mask
    indicating what type of GLXContext a drawable created with
    the corresponding GLXFBConfig can be bound to. The following
    bit settings are supported: GLX_RGBA_BIT, GLX_RGBA_FLOAT_BIT_ARB, and
    GLX_COLOR_INDEX_BIT. If combinations of bits are set in the mask then
    drawables created with the GLXFBConfig can be bound to those
    corresponding types of rendering contexts.

    Add to Section 3.3.3 (p.15) after first paragraph:

    Note that floating point rendering is only supported for
    GLXPbuffer drawables.  The GLX_DRAWABLE_TYPE attribute of
    the GLXFBConfig must have the GLX_PBUFFER_BIT bit set and
    the GLX_RENDER_TYPE attribute must have the
    GLX_RGBA_FLOAT_BIT_ARB set.

    Modify Section 3.3.7 (p.25 Rendering Contexts) remove period
    at end of second paragraph and replace with:

    ; if render_type is set to GLX_RGBA_FLOAT_TYPE_ARB, then a context that
    supports floating point RGBA rendering is created.

Additions to Chapter 4 of the GLX 1.3 Specification (Encoding on the
X Byte Stream)

    None

Additions to Chapter 5 of the GLX 1.3 Specification (Extending
OpenGL)

    None

Additions to Chapter 6 of the GLX 1.3 Specification (GLX Versions)

    None

Additions to Chapter 7 of the GLX 1.3 Specification (Glossary)

    None

Additions to the GLX Specification

    Modify the bit field GLX_RENDER_TYPE to:

    GLX_RENDER_TYPE
    The type of pixel data. This bit field can have one of the following
    bits set: GLX_RGBA_BIT, GLX_RGBA_FLOAT_BIT_ARB, GLX_COLOR_INDEX_BIT

    Adds to the accepted values of the <render_type> argument
    in the glXCreateNewContext and glXCreateContextWithSGIX
    functions to:

    <render_type>
    Type of rendering context requested. This argument can have the
    following values: GLX_RGBA_TYPE, GLX_RGBA_FLOAT_TYPE_ARB,
    GLX_COLOR_INDEX_TYPE

GLX Protocol

    The following rendering commands are sent to the server as part
    of a glXRender request:

    ClampColorARB
        2            12              rendering command length
        2            234             rendering command opcode
        4            CARD32          target
        4            CARD32          clamp

Additions to the WGL Specification

    Modify the values accepted by WGL_PIXEL_TYPE_ARB to:

        WGL_PIXEL_TYPE_ARB
        The type of pixel data. This can be set to WGL_TYPE_RGBA_ARB,
        WGL_TYPE_RGBA_FLOAT_ARB, or WGL_TYPE_COLORINDEX_ARB.

Dependencies on WGL_ARB_pixel_format

    The WGL_ARB_pixel_format extension must be used to determine a
    pixel format with float components.

Dependencies on ARB_fragment_program

    (modify 2nd paragraph of Section 3.11.4.4 language) If fragment
    color clamping is enabled, the fragment's color components are first
    clamped to the range [0,1] and are optionally converted to fixed
    point as in section 2.14.9.  If the fragment program does not write
    result.color, the color will be undefined in subsequent stages.

Dependencies on ARB_fragment_shader

    (modify 1st paragraph of Section 3.11.6 language) ... are
    gl_FragColor and gl_FragDepth.  If fragment color clamping is
    enabled, the final fragment color values written by a fragment
    shader are clamped to the range [0,1] and are optionally converted
    to fixed-point as described in section 2.14.9, Final Color
    Processing.  ...

Dependencies on NV_float_buffer

    Note that the WGL/GLX enumerants for the NV and ARB extensions
    do not have the same values, so it is possible to distinguish
    between "NV" and "ARB" pixel formats.

    If NV_float_buffer and ARB_color_buffer_float are both supported,
    restrictions imposed by NV_float_buffer are removed.  In
    particular, antialiasing application, multisample fragment
    operations, alpha test, and blending are all performed as
    specified in this extension.  Additionally, it is not necessary to
    use a fragment program or shader to render to a floating-point
    color buffer allocated using the NV_float_buffer extension.

    Note also that vertex color clamp portion of this extension does
    not interact with NV_float_buffer.

Dependencies on ATI_pixel_format_float

    The basic policy of ATI_pixel_format_float regarding clamping is
    that vertex color clamping is unaffected (still enabled) and that
    fragment color clamping is automatically disabled when rendering
    to floating-point color buffers.

    This extension is designed so that the defaults are compatible
    with the ATI_pixel_format_float, so there is no need for separate
    "ATI" and "ARB" floating-point pixel formats.


Errors

    None

New State

    (modify table 6.10, p. 271)
                                                    Initial
    Get Value                   Type  Get Command   Value     Description      Sec.    Attribute
    -------------------------   ----  -----------   -------   ---------------  ----    ---------
    CLAMP_VERTEX_COLOR_ARB      B     GetIntegerv   TRUE      vertex color     2.14.6  lighting/enable
                                                              clamping
    CLAMP_FRAGMENT_COLOR_ARB    B     GetIntegerv   FIXED_    fragment color   2.14.6  color-buffer/enable
                                                    ONLY_ARB  clamping
    CLAMP_READ_COLOR_ARB        B     GetIntegerv   FIXED_    read color       2.14.6  color-buffer/enable
                                                    ONLY_ARB  clamping

    (modify table 6.33, p. 294)

                                                    Minimum
    Get Value                  Type   Get Command   Value    Description       Sec.   Attribute
    ------------------------   ----   -----------   -------  ----------------  ----   ----------
    RGBA_FLOAT_MODE_ARB        B      GetBooleanv   -        True if RGBA      2.7    -
                                                             components are
                                                             floats

New Implementation Dependent State

    None

Revision History

    Rev.    Date    Author     Changes
    ----  -------- ---------  --------------------------------------------
      1   2/26/04  Kirkland   Initial version based on the ATI extension.

      2   3/11/04  Kirkland   Changed spec to be both a GL and WGL spec.
                              Updated language for float16 number handling.
                              Added bit encodings for half values.
                              Removed the clamped color query.
                              Updated the language for dithering.

      3   7/23/04  Kirkland   Added alternative encodings options for
                              float16 format.

      4   9/17/04  Kirkland   Merged the color clamp control spec with
                              this spec.
                              Updated to reference the OpenGL 2.0 spec.
                              Added the specification for GLX.

      5   10/1/04  Kirkland   Updated IP section.
                              Reviewed by the ARB and closed all
                              UNRESOLVED issues.
                              Added an invariant that discusses the
                              handling of the alpha test.

      6   2/6/07   Jon Leech  Fix typos in enum naming.

      7   2/13/07  Jon Leech  Add GLX protocol from James Jones
                              at NVIDIA.

      8   2/15/07  Jon Leech  Assign GLX rendering opcode.

      9   4/1/15   Jon Leech  Add missing _ARB suffix to 
                              GLX_RGBA_FLOAT_TYPE and GLX_RGBA_FLOAT_BIT
                              (bug 13717).
