Name

    SGIS_color_range

Name Strings

    GLX_SGIS_color_range
    GL_SGIS_color_range

Version

    $Date: 1999/06/23 23:25:41 $ $Revision: 1.9 $

Number

    115

Dependencies

    OpenGL 1.1 is required
    SGIX_fbconfig is required
    SGIX_fbconfig_float is recommended
    EXT_histogram affects the definition of this extension
    SGI_color_table affects the definition of this extension
    SGIS_multisample affects the definition of this extension

Overview

    This extension enhances the fbconfig types to support fbconfigs
    (visuals) with extended range color data. The range of color data is
    extended from [0,1] to [min,max], e.g., [-1.5,4.0].  Most OpenGL data
    paths which clamp colors to [0,1] are modified to clamp colors to
    [min,max].  The range is a fixed property of the fbconfig. Extended
    range color is useful for imaging calculations and multipass shading
    operations which often require signed data or increased dynamic range.

IP Status

    Silicon Graphics has filed for patent protection for some of the
    techniques described in this extension document.

Issues

    * how does an application request the color range it needs to represent?
      should the min/max values be interpreted specially in ChooseConfig
      or should they be of a more limited usefulness exact match style?

        They are interpreted uniquely.  An fbconfig is chosen with the
        tightest possible bound which meets or exceeds the range
        indicated by the application.

    * the spec does not distinguish between old-style [0,1] color
      and extended range color (i.e. no attribute bits, just
      the min and max values).  Is this okay?   NO!!!

        Added EXTENDED_RANGE_SGI attribute to distinguish extended
        range visuals from other visuals.

    * float input pixel values and float colors automatically support the
      extended range.  Integer colors are still scaled to [0,1].
      This means that GetIntegerv of an extended range color can not
      represent an extended color range. Is this okay? YES.

    * when the color range is extended this implies that accumulation buffers
      and texture colors also support the extended range. Is this okay?

      it has been suggested that accumulation stay as [-1,1] which would
      imply that out of range results would leave the acbuf undefined?

    * if a component isn't stored in the framebuffer (bits == 0) what should
      range queries return.  0 seems obvious for R, G, and B, but what about
      alpha.  If there is no alpha value, should alpha be the max value?

      no, alpha is 1.0

    * treatment of alpha in general - whenever it would have been set to
      1.0 it continues to be 1.0 not <max>

    * do the ONE_MINUS* blend functions change?  no.  they are still 1.0-x
      If the resulting value is negative it is clamped to <min> not 0.
      Same is true for texture environment calculations.

    * do transparent pixel values need to be embellished?

    * floating point representations need some more clarification:
        1. internal formats  (need new extensions for these)
        2. logic op          (operates on mantissa or on the raw value?)
        3. color table lookups (raw bits or clamped[0,1]
        4. color indices     - not supported
        5. GLX_{RGBA}_SIZE   - returns number of bits in the representation

    * float versions of glXGetFBConfigAttribSGIX?   YES!

    * is clamp to [0,1] behavior necessary?  it could be useful to have this
      behavior where colors are used for blend factors in the texture
      environment and color buffer blending operations.

    * Is this extension SGI, SGIX, or SGIS?  SGIS, because it does not
      apply to all SGI platforms, however unlike SGIX, is intended for
      wide acceptance.


New Procedures and Functions

    None


New Tokens

    Accepted by the <pname> parameters of GetBooleanv, GetIntegerv,
    GetFloatv, and GetDoublev, the <attrib_list> parameter of
    glXChooseFBConfigSGIX, and the <int_attrib_list> and
    <flt_attrib_list> parameters of glXChooseFBConfigWithFltSGIX.

        EXTENDED_RANGE_SGIS             0x85A5
        MIN_RED_SGIS                    0x85A6
        MAX_RED_SGIS                    0x85A7
        MIN_GREEN_SGIS                  0x85A8
        MAX_GREEN_SGIS                  0x85A9
        MIN_BLUE_SGIS                   0x85AA
        MAX_BLUE_SGIS                   0x85AB
        MIN_ALPHA_SGIS                  0x85AC
        MAX_ALPHA_SGIS                  0x85AD

    Accepted by the <attribute> parameter of glXGetFBConfigAttribSGIX
    and glXGetFBConfigFltAttribSGIX, the <attrib_list> parameter of
    glXChooseFBConfigSGIX, and the <int_attrib_list> and
    <flt_attrib_list> parameters of glXChooseFBConfigWithFltSGIX:

        GLX_EXTENDED_RANGE_SGIS         0x????
        GLX_MIN_RED_SGIS                0x????
        GLX_MAX_RED_SGIS                0x????
        GLX_MIN_GREEN_SGIS              0x????
        GLX_MAX_GREEN_SGIS              0x????
        GLX_MIN_BLUE_SGIS               0x????
        GLX_MAX_BLUE_SGIS               0x????
        GLX_MIN_ALPHA_SGIS              0x????
        GLX_MAX_ALPHA_SGIS              0x????

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

    Section 2.7 Vertex Specification

    Versions of the Color command that take floating-point values
    accept values nominally between <min> and <max>.  <min> corresponds
    to the minimum value while <max> corresponds to the maximum (machine
    dependent) value that a component may take on in the framebuffer.

    The three component variants of the color command set A to 1.0


    Section 2.13 Colors and Coloring

    Unsigned integer colors are still scaled to the range [0,1] and thus cannot
    directly represent colors outside the range [0,1].  Signed integer and
    floating-point colors can be used to represent colors outside the range
    [0,1].

    Section 2.13.6 (Clamping or Masking)

    After lighting, RGBA colors are clamped to the range [min, max].

    Section 2.13.9 (Final Color Processing)

    For an RGBA color, each color component (which lies in [min,max]) is
    converted (by rounding to nearest) to a value with m bits.
    If the value is fixed-point we assume that the
    representation used represents each value min+(max-min)k/(2^m - 1),
    where k is in {0, 1, ..., 2^m - 1}, as
    k (e.g. <max> 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.
    [XXX what should we assume if the value is not a fixed point value?]

    [XXXare the rules for the msbs of unsigned color values matching the
     framebuffer components true for color ranges outside [0,1]?]


Additions to Chapter 3 of the 1.1 Specification (Rasterization)

    Section 3.6.3 (Rasterization of Pixel Rectangles)

    Final Expansion to RGBA

    if a group does not contain an A element, then A is added and set to 1.0.
    If any of R, G, or B is missing from the group, each missing element is
    assigned a value of 0.0.

    RGBA to RGBA Lookup

    First, each component is clamped to the range [0,1]. If there is a
    table associated with each of the R, G, B, and A component elements:
    PIXEL_MAP_R_TO_R for R, PIXEL_MAP_G_TO_G for G, PIXEL_MAP_B_TO_B for B,
    and PIXEL_MAP_A_TO_A for A.  Each element is multiplied by t
    where t is an integer one less than the size of the corresponding table,
    and, for each element, an address is found by rounding this value to
    the nearest integer.  For each element, the addressed value in the
    corresponding table replaces the element.

    Histogram

    If HISTOGRAM_EXT is enabled and the width of the table is non-zero, and
    the pixel groups contain RGBA values, then indices Ri, Gi, Bi, and Ai
    are derived from the red, green, blue, and alpha components of each
    pixel group (without modifying these components) by clamping the
    components to [0,1], multiplying each by t/(max-min) where t is one
    less than the width of the histogram table, and rounding each to the
    nearest integer.  The color components used to index the histogram
    are clamped, the original values are passed through unmodified to
    the min/max stage.

    Color Table

    The color components of each group that are being replaced by table
    values are converted to indices by clamping the components to
    [0,1], multiplying each by t, where t is one less than
    the width of the color table, and rounding each to the nearest
    integer.  The component value (R, G, B, or A) is then replaced by the
    value in color table indicated in table E14.2, at the computed index.


    Final Conversion

    For RGBA components each element is clamped to [min,max].  The resulting
    values are converted to fixed-point according to the rules given in
    section 2.12.9 (Final Color Processing).


    Section 3.8 (Texturing)

    Each R, G, B, and A value so extracted is clamped to [min,max].
    Each of the four values set by TEXTURE_BORDER_COLOR is clamped to lie
    in [min,max].

    Section 3.8.5 (Texture Environments and Texture Functions)

    TEXTURE_ENV_COLOR is set to an RGBA color by providing four
    single-precision floating-point values in the range [min,max] (values
    outside this range are clamped to it).

    R, G, B, and A values after being obtained from a supplied texture image,
    are in the range [min, max].

    [modifications to table 3.9???]

    Section 3.9 (Fog)

    Each component of Cf is clamped to [min, max] when specified.


Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations
and the Frame buffer)

    Color buffers consist of either unsigned integer color indices or
    R, G, B, and , optionally A unsigned or signed integer values.
    [XXXfloating point]

    4.1.2.5 Multisample Fragment Operations

    If SAMPLE_ALPHA_TO_MASK_SGIS is enabled, the fragment alpha value used
    for mask conversion is clamped to [0,1] before the mask is generated, but
    the fragment alpha value is left unchanged.  If SAMPLE_ALPHA_TO_ONE_SGIS
    is enabled the fragment alpha is set to 1.0.

    Section 4.1.3 (Alpha Test)

    ref is clamped to lie in [min, max], and then converted to a fixed-point
    value according to the rules given for an A component in section 2.13.9.

    Section 4.2.3 (Clearing the Buffers)

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

    sets the clear value for the color buffers in RGBA mode.  Each of the
    specified components is clamped to [min, max] and converted to fixed-point
    according to the rules of section 2.12.9.

    void ClearAccum(clampf r, clampf g, clampf b, clampf a);

    takes four floating-point arguments that are the values, in order, to which
    to set the R, G, B, and A values of the accumulation buffer (see the next
    section).  These values are clamped to the range [min2,max] where min2
    = minimum(-1,<min>) when they are specified.


    Section 4.2.4 (The Accumulation Buffer)

    Accumulation buffer values are taken to be signed values in the range
    [min2,max] where min2 = minimum(-1,<min>).  Using ACCUM obtains the R, G,
    B, and A components from the buffer current selected for
    reading (section 4.3.2).  Each component, considered as a fixed-point
    values in [min,max] (see section 2.12.9) is converted to floating-point.
    Each result is then multiplied by value.

    The color components operated on by Accum must be clamped only if the
    operation is RETURN.  In this case, a value sent to the enabled color
    buffers is first clamped to [min,max].  Otherwise, results are undefined
    if the result of an operation on a color component is too large (in
    magnitude) to be represented by the number of available bits.

    4.3.2 (Reading Pixels)

    Conversion to RGBA values

    The R, G, and B (and possibly A) values form a group of elements.  Each
    element is taken to be a fixed-point value in [min,max] with m bits, where
    m is the number of bits in the corresponding color component of the
    selected buffer (see section 2.12.9)

    Final Conversion

    For a component, if the type is floating point then each component is first
    clamped to [min, max]; if the type is signed integer, then the component is
    clamped to the more restrictive of [-1,1] and [min,max], otherwise each
    component is first clamped to [0,1].  Then the appropriate conversion
    formula from Table 4.7 is applied to the component.


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

    None

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

    None

Additions to the GLX Specification

    [Added to the description of glXChooseFBConfigSGIX ]

    If GLX_EXTENDED_RANGE_SGIS is specified as True, and if any of
    GLX_MIN_RED_SGIS, GLX_MAX_RED_SGIS, GLX_MIN_GREEN_SGIS,
    GLX_MAX_GREEN_SGIS, GLX_MIN_BLUE_SGIS, GLX_MAX_BLUE_SGIS,
    GLX_MIN_ALPHA_SGIS, or GLX_MAX_ALPHA_SGIS are specified in <attrib_list>
    then the value that follows indicates the minimum or maximum value
    which can be represented in the OpenGL pipeline as a color.  Any
    OpenGL state which stores color values (e.g. current color, texture
    data, the color buffer, accumulation buffer, aux buffers, etc) can
    represent values between the minimum and maximum range.  Integer
    values for MIN and MAX attributes are cast to double precision
    floating point, which is the internal representation of these
    attributes.  Non-integral values for these attributes may be
    specified using glXChooseFBConfigWithFltSGIX, which is
    defined in the SGIX_fbconfig_float GLX extension.

    The visuals returned by glXChooseFBConfigSGIX are sorted on the
    basis of color range if and only if GLX_EXTENDED_RANGE_SGIS is
    specified as True.  In that case, color range has a higher
    precedence than GLX_DEPTH_BITS and a lower precedence than
    GLX_SAMPLES_SGIS.

    Extended color range visuals can be specified for both displayable
    (window) and non-displayable (pixmap) drawables.  Extended range
    visuals are displayed in a device-dependant manner, however for
    traditional color displays they will typically be clamped to the
    range [0,1].

    [Added to Table 3]

    Attribute                       Type     Description
    ---------                       ----     -----------
    GLX_EXTENDED_RANGE_SGIS         boolean  true if visual is extended range
    GLX_MIN_RED_SGIS                double   minimum value of red component
    GLX_MAX_RED_SGIS                double   maximum value of red component
    GLX_MIN_GREEN_SGIS              double   minimum value of green component
    GLX_MAX_GREEN_SGIS              double   maximum value of green component
    GLX_MIN_BLUE_SGIS               double   minimum value of blue component
    GLX_MAX_BLUE_SGIS               double   maximum value of blue component
    GLX_MIN_ALPHA_SGIS              double   minimum value of alpha component
    GLX_MAX_ALPHA_SGIS              double   maximum value of alpha component

    [Added to Table 4]

    Attribute                       Default     Sorting Criterion
    ---------                       -------     -----------------
    GLX_EXTENDED_RANGE_SGIS         False       exact
    GLX_MIN_RED_SGIS                0.0         range
    GLX_MAX_RED_SGIS                1.0         range
    GLX_MIN_GREEN_SGIS              0.0         range
    GLX_MAX_GREEN_SGIS              1.0         range
    GLX_MIN_BLUE_SGIS               0.0         range
    GLX_MAX_BLUE_SGIS               1.0         range
    GLX_MIN_ALPHA_SGIS              0.0         range
    GLX_MAX_ALPHA_SGIS              1.0         range

        range - configs with a [MIN,MAX] range that meets or exceeds
          the specified range are returned, with precedence given to
          tighter bounds (that is, less negative MIN and less positive
          MAX).

GLX Protocol

    [tbd]

Dependencies on EXT_histogram

    If EXT_histogram is not implemented, then the references to
    GetHistogramEXT and GetMinmaxEXT in this file are invalid, and should be
    ignored.

Dependencies on SGI_color_table

    If SGI_color_table is not implemented, then the references to
    ColorTableSGI and GetColorTableSGI in this file are invalid, and should
    be ignored.

Dependencies on SGIS_multisample

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

Errors

    None

New State

    None

New Implementation Dependent State

    Get Value           Get Command     Type    Minimum Value   Maximum Value
    ---------           -----------     ----    -------------   -------------
    EXTENDED_RANGE_SGIS GetBooleanv     B
    MIN_RED_SGIS        GetFloatv       R       -               0.0
    MAX_RED_SGIS        GetFloatv       R+      1.0             -
    MIN_GREEN_SGIS      GetFloatv       R       -               0.0
    MAX_GREEN_SGIS      GetFloatv       R+      1.0             -
    MIN_BLUE_SGIS       GetFloatv       R       -               0.0
    MAX_BLUE_SGIS       GetFloatv       R+      1.0             -
    MIN_ALPHA_SGIS      GetFloatv       R       -               0.0
    MAX_ALPHA_SGIS      GetFloatv       R+      1.0             -
