Name

    SGIS_pixel_texture

Name Strings

    GL_SGIS_pixel_texture

Version

    Last Modified Date: July 15, 1998
    Author Revision: $Header: //depot/main/doc/registry/extensions/SGI/pixel_texture.spec#14 $

Number

    15

Dependencies

    None

Overview

    The geometry rasterization and pixel pipeline "convert to fragment"
    stages each produce fragments.  The fragments are processed by
    a unified per fragment pipeline that begins with the application
    of the texture to the fragment color.  Because the pixel pipeline
    shares the per fragment processing with the geometry pipeline, the
    fragments produced by the pixel pipeline must have the same fields
    as the ones produced by the geometry pipeline.  When
    pixel groups are being converted to fragments, the parts 
    of the fragment that aren't derived from the pixel groups 
    are taken from the associated values in the current raster position.

    A fragment consists of x and y window coordinates and their
    associated color value, depth value, and texture coordinates.
    In the 1.1 OpenGL specification, when the pixel group is RGBA
    the fragment color is always derived from the pixel group, 
    and the depth value and texture coordinates always come 
    from the raster position.

    This extension provides a way to specify how the texture coordinates
    of the fragments can be derived from RGBA pixel groups.  When
    this option is enabled, the source of the fragment color value
    when the pixel group is RGBA can be specified to come from either 
    the raster position or the pixel group.

    Deriving the fragment texture coordinates from the pixel group
    effectively converts a color image into a texture coordinate image.
    The multidimensional texture mapping lookup logic also makes this
    extension useful for implementing multidimensional color lookups.
    Multidimensional color lookups can be used to implement very
    accurate color space conversions.

    Deriving texture coordinates from the pixel groups in the pixel
    pipeline introduces a problem with the lambda parameter in the
    texture mapping equations.  When texture coordinates are
    being taken from the current raster position texture coordinates,
    the texture coordinate values don't change from pixel to pixel,
    and the equation for calculating lambda always produces zero.
    Enabling pixel_texture introduces changes in the texture
    coordinates from pixel to pixel which are not necessarily
    meaningful for texture lookups.  This problem is addressed
    by specifying that lambda is always set to zero when pixel_texture 
    is enabled.  

Issues

    * Why do we need the named param?  

      Originally the single mode parameter was sufficient to control
      the fragment's color source.  However, new extensions (currently
      lod and bit and possibly more in the future) introduce
      additional ways to manipulate the way pixel texture operates.
      These extensions modify the behavior of functionality which
      is orthogonal to the functionality modified by this extension,
      so multiple pixel_texture parameters are needed.  The named
      parameter provides a way to set the multiple pixel_texture
      parameters.

    * Should LOD be supported?  

      This has been addressed by the GL_SGIX_pixel_texture_lod extension.

    * The fragment color source can be viewed as having its own
      distinct functionality separate from the role it plays in
      PIXEL_TEXTURE_SGIS.  Should it have its own extension?  
      
      No.

    * We chose the name PixelTexGenParameterSGIS because PixelTexGenSGIX
      has already been taken by the impact_pixel_texture extension.
      Should the name be TexGenParam rather than PixelTexGenParam?
      TexGenParam would then be used to expand either geometry texgen
      functionality or pixel_texture functionality.  Or can we get
      away with using PixelTexGen{if}?

      Use PixelTexGenParameteriSGIS and PixelTexGenParameterivSGIS.

    * Should the PIXEL_TEXTURE_SGIS pipeline include a texture matrix?

      No.  The color matrix can be used if needed.  
      The texture matrix takes place during geometry rasterization --
      it's nice to keep that part of the pipeline separate 
      from the pixel part.

    * Do we need to include PixelTexGenParameter{if}vSGIS to be
      complete?  
      
      Yes.  This will make things less confusing if future
      extensions want to define a float named param.  

New Procedures and Functions

    void PixelTexGenParameter{if}SGIS(enum pname, T param);
    void GetPixelTexGenParameter{if}vSGIS(enum pname, T params);

New Tokens

    Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, and
    by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and
    GetDoublev:

        PIXEL_TEXTURE_SGIS                      = 0x8353

    Accepted by the <pname> parameter of PixelTexGenParameteriSGIS
    and GetPixelTexGenParameterivSGIS:
	
        PIXEL_FRAGMENT_RGB_SOURCE_SGIS          = 0x8354
        PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS        = 0x8355

    Accepted by the <param> parameter of PixelTexGenParameteriSGIS:
	
        PIXEL_GROUP_COLOR_SGIS                  = 0x8356

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

    None

Additions to Chapter 3 of the 1.0 Specification (Rasterization)

    This extension modifies the "Conversion to Fragments" subsection of
    section 3.6.3 (Rasterization of Pixel Rectangles) of the GL
    Specification.  The paragraph beginning with "A fragment
    arising from a group..." ends with "color and texture coordinates
    are given by those associated with the current raster position."
    The rest of the paragraph, beginning with "In both cases texture
    coordinates..." is replaced with the following:
    
    In all cases texture coordinates s, t, and r are replaced with
    s/q, t/q, and r/q, respectively.  If q is less than or equal to
    zero, the results are undefined.  Groups arising from DrawPixels
    with a format of STENCIL_INDEX are treated specially and 
    are described in section 4.3.1.

    The treatment of fragments arising from groups consisting of RGBA color
    data is affected by PIXEL_TEXTURE_SGIS, which is enabled and disabled by
    calling Enable and Disable with PIXEL_TEXTURE_SGIS passed as the <cap>
    parameter.

    When PIXEL_TEXTURE_SGIS is enabled, a fragment arising from 
    a group consisting of RGBA color data takes its depth component 
    from the current raster position depth, and the texture coordinates 
    are assigned as follows:

      Pixel group's red becomes the fragment S texture coordinate
      Pixel group's green becomes the fragment T texture coordinate
      Pixel group's blue becomes the fragment R texture coordinate
      Pixel group's alpha becomes the fragment Q texture coordinate

    The default operation is to set the texture coordinate value to
    the color component value with no conversion.  

    Various parameters control how the fragment is derived from
    the pixel group when PIXEL_TEXTURE_SGIS is enabled.  
    Each parameter is set by calling

	PixelTexGenParameter{if}(enum pname, T param) ;
	PixelTexGenParameter{if}v(enum pname, T params) ;

    The parameter pname is a symbolic constant indicating the parameter to be
    set.  In the first form of the command, params is value to which
    to set a single-valued parameter; in the second form of the
    command, params is an array of parameters whose type depends
    on the parameter being set.  
    
    If pname is PIXEL_FRAGMENT_RGB_SOURCE_SGIS or 
    PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS, param is an integer 
    that is one of the symbolic constants CURRENT_RASTER_COLOR or 
    PIXEL_GROUP_COLOR_SGIS.  

    The assignment of the fragment color components when PIXEL_TEXTURE_SGIS
    is enabled is determined by the values of PIXEL_FRAGMENT_RGB_SOURCE_SGIS 
    and PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS as defined by the following tables:

      PIXEL_FRAGMENT_RGB_SOURCE_SGIS       Resulting fragment RGB
      ------------------------------       ----------------------
      CURRENT_RASTER_COLOR			CRP's RGB
      PIXEL_GROUP_COLOR_SGIS			PG's RGB

      PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS     Resulting fragment A
      -------------------------------- 	   --------------------
      CURRENT_RASTER_COLOR			CRP's A
      PIXEL_GROUP_COLOR_SGIS			PG's A

      PG, CRP, R, G, B, A are abbreviations of "current raster
      position", "pixel group", "red", "green", "blue", and "alpha"
      respectively.  
   
    When the pixel_texture extension is enabled, the lambda
    value used in the texture mapping equations is set to zero.

Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)

    The operation of PIXEL_TEXTURE_SGIS during pixel copy operations is
    identical to the operation during pixel drawing.

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

    The following commands are not included in display lists:

	GetPixelTexGenParameter{if}vSGIS

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

    Add to the list of Get commands following the paragraph starting
    with "Other commands exist to obtain state variables that are 
    indexed by a target...":

	GetPixelTexGenParameter{if}vSGIS( enum value, T data );

    Change the phrase a few paragraph later "GetMaterial, GetTexGen, 
    GetTexEnv, and GetTexParameter are similar to GetLight, 
    placing information..." to "GetMaterial, GetTexGen, GetTexEnv, 
    GetTexParameter, and GetPixelTexGenParameter{if}vSGIS 
    are similar to GetLight, placing information..."

Additions to the GLX Specification

    None

Errors

    INVALID_ENUM is generated if PixelTexGenParameterSGIS parameter <pname> 
    is not PIXEL_FRAGMENT_RGB_SOURCE_SGIS or PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS.

    INVALID_ENUM is generated if PixelTexGenParameterSGIS parameter <pname>
    is one of PIXEL_FRAGMENT_RGB_SOURCE_SGIS or 
    PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS and parameter <param> is not 
    CURRENT_RASTER_COLOR or PIXEL_GROUP_COLOR_SGIS.

    INVALID_OPERATION is generated if PixelTexGenParameteriSGIS,
    PixelTexGenParameterivSGIS, or GetPixelTexGenParameterivSGIS 
    are called between the execution of Begin and the execution 
    of the corresponding End.

New State

    The following is added to Table 6.16. Pixels.

    Get Value				Get Command			Type	Initial Value			Attrib
    ---------				-----------			----	-------------			------
    PIXEL_TEXTURE_SGIS			IsEnabled			B	FALSE				pixel/enable
    PIXEL_FRAGMENT_RGB_SOURCE_SGIS	GetPixelTexGenParameterivSGIS	Z2	PIXEL_GROUP_COLOR_SGIS		pixel
    PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS	GetPixelTexGenParameterivSGIS	Z2	PIXEL_GROUP_COLOR_SGIS		pixel

New Implementation Dependent State

    None
