skia / external / github.com / KhronosGroup / OpenGL-Registry / eae1d6dde1e283f6fdf803274a2484007e592599 / . / extensions / SGIS / GLX_SGIS_color_range.txt

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 - |