Name SGI_complex Name Strings GL_SGI_complex Version $Date: 1996/10/01 21:31:49 $ $Revision: 1.4 $ Number 87 Dependencies EXT_abgr affects the definition of this extension EXT_texture3D affects the definition of this extension EXT_subtexture affects the definition of this extension EXT_histogram affects the definition of this extension EXT_convolution affects the definition of this extension SGI_color_table affects the definition of this extension SGIS_texture4D affects the definition of this extension EXT_cmyka affects the definition of this extension EXT_blend_minmax affects the definition of this extension EXT_blend_logicop affects the definition of this extension EXT_blend_subtract affects the definition of this extension Overview This extension extends the notion of color values to include complex color consisting of a real and imaginary parts or subcomponents for each color component. This extension defines the extended semantics for all operations that currently apply to color values. The purpose of this extension is to provide the foundation for complex color processing. With this foundation in place further extensions can be added to define complex input formats, complex storage formats, and additional complex processing operations. Issues * is there a better way? * all multiplies of color*color become complex multiplies (texture environment, blending); is this overkill? * scalar multiplies for fog and antialiasing coverage scale the real and imaginary components equally. is this okay? New Procedures and Functions None New Tokens None Additions to Chapter 2 of the GL Specification (OpenGL Operation) To Section 2.7 Vertex Specification Paragraph 3: Finally, there are several ways to set the current color. The GL stores both a current single-valued color index, and a current 4-valued complex RGBA color. One or the other of these is significant depending as the GL is in color index mode or RGBA mode. The mode selection is made when the GL is initialized. In RGBA mode state is maintained for both the real and imaginary parts of each component, but only the real part may be set. Paragraph 5: ... The initial RGBA color is (R, G, B, A) = ({1,0},{1,0},{1,0},{1,0}). Section 2.12 Colors and Coloring Paragraph 1: Paragraph 2: ... After lighting, both real and imaginary parts of RGBA colors are clamped to the range [0, 1]. Section 2.12.1 Lighting [ All colors expanded to complex ] Section 2.12.6 Clamping or Masking Paragraph 1: ... After lighting, real and imaginary parts of RGBA colors are clamped to [0, 1]. ... Section 2.12.8 Color and Texture Coordinate Clipping [ are real and imaginary parts clipped independently? ] Section 2.12.9 Final Color Processing [ indicate the both real & imaginary components are converted and stored as appropriate for the framebuffer ] Additions to Chapter 3 of the GL Specification (Rasterization) Section 3.2 Antialiasing Paragraph 2: In RGBA mode, the R, G, and B values of the rasterized fragment are left unaffected, but the A value is multiplied by a floating-point real value in the range [0, 1] that describes a fragment's screen coverage. ... Section 3.6.3 Rasterization of Pixel Rectangles Conversion to Complex (follows Conversion to floating point) This step applies only to groups of components. It is no performed on indices. Each element in a group is converted to a complex value by setting the real part to the floating-point value computed in the previous step and setting the imaginary part to zero. RGBA to RGBA Lookup ... First, each component is converted to a real value by discarding the imaginary component and the real value is clamped to the range [0, 1]. 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 an integer on less thanthe size of the corresponding table, and, for each element, and address is found by rounding this value to the nearest integer. For each element, the addressed value in the correspoding table replaces the element. The real value is then converted to a complex value by assigning zero to the imaginary part. Section 3.8 Texturing Paragraph 2 ... The arguments width, height, format, type, and data correspond precisely to the corresponding arguments to DrawPixels (refer to section 3.6.3); they specify the image's width and height., a format of the image data, the type of those data, and a pointer to the image data in memory. The image is taken from memory exactly as if these arguments were passed to DrawPixels, but the process stops just before final conversion. Both the real and imaginary part of the complex R, G, B, and A value so extracted is clamped to [0, 1]. ... Section 3.8.3 Texture Environments and Texture Functions Paragraph 1. ... TEXTURE_ENV_COLOR is set to a RGBA color by providing four single-precision floating-point values in the range [0, 1]. (values outside this range are clamped to it). The four values are assigned to the real parts of the complex color; the imaginary parts are unchanged from the default value of zero. If intergers are proivide for TEXTURE_ENV_COLOR, then they are converted to floating-point as specified in Table 2.4 for signed integers. Table 3.9 [ modify to show complex equations ] Paragraph 3. The state required for the current texture environment consists of the three-valued integer indicating the texture function and four complex floating-point TEXTURE_ENV_COLOR values. In the initial state, the texture function is given by MODULATE and TEXTURE_ENV_COLOR is ({0,0},{0,0},{0,0},{0,0}). Section 3.9 Paragraph 5. ... The R, G, B, and A values of C sub f are specified by calling Fog with equal to FOG_COLOR; in this case params points to four values comprising the real part of C sub f. ... Paragraph 7. The state required for fog consists of a three valued integer to select the fog equation, three floating-point values d, e, and s, and RGBA fog color a fog color index, and a single bit to indicate whether or not fog is enabled. In the initial state, fog is disabled, FOG_MODE is EXP, d = 1.0, e = 1.0, and s = 0.0; C sub f = ({0,0},{0,0},{0,0},{0,0}) and i sub f = 0. Additions to Chapter 4 of the GL Specification (Per-Fragment Operations and the Framebuffer) Paragraph 3. Color buffers consist of either unsigned integer color indices or R, G, B, and optionally A unsigned integer values storing the real parts of pixel colors. Section 4.1.3 Alpha test This step applies only in RGBA mode. In color index mode, proceed to the next step. The alpha test discards a fragment conditional on the outcome of a comparison between the incoming fragments's alpha real-part value and a constant value. ... Section 4.1.6 Blending [complex blending equations. the destination color imaginary subcomponent is zero so the equations degenerate to the real equations, GL_ONE is interpreted as {1,0} and GL_ZERO as {0,0} ] Section 4.3.2 Reading Pixels Conversion of RGBA values Paragraph 2. 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 [0,1] wiht m bits, where m is the number of bits in the corresponding color component of the selected buffer (see section 2.12.9). The corresponding color value is assigned to the real-part of the resulting color. The imaginary part is set to zero. Convolution [???] Color Tables [???] Histogram [???] Final Conversion For an index, if the type is not FLOAT, final conversion consists of masking the index with the value given Table 4.6; if the type is FLOAT, then the integer index is converted to a GL float data value. For a component, each the real and imaginary parts are first clamped to [0,1] Then the appropriate conversion formula from Table 4.7 is applied to the both the real and imaginary parts of each component. Additions to Chapter 5 of the GL Specification (Special Functions) Section 5.1 Evaluators [ color maps evaluate to complex colors, by setting imaginary component to zero ] Section 5.3 Feedback [ only real colors are returned. define new COLOR formats to get complex colors ] Additions to Chapter 6 of the GL Specification (State and State Requests) [ add GetComplexFloatv(enum value, float *data); redefined state tables ] Additions to the GLX Specification None GLX Protocol Errors None New State [ lots ? ] New Implementation Dependent State None