| Name | 
 |  | 
 |     MESAX_texture_stack | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_MESAX_texture_stack | 
 |  | 
 | Contact | 
 |  | 
 |     Ian Romanick, IBM (idr 'at' us.ibm.com) | 
 |  | 
 | IP Status | 
 |  | 
 |     No known IP issues. | 
 |  | 
 | Status | 
 |  | 
 |     TBD | 
 |  | 
 | Version | 
 |  | 
 |     $Date: 2005/12/12$ $Revision: 0.3$ | 
 |  | 
 | Number | 
 |  | 
 |     318 | 
 |  | 
 | Dependencies | 
 |  | 
 |     OpenGL 1.2 or GL_EXT_texture3D is required. | 
 |  | 
 |     Support for ARB_fragment_program is assumed, but not required. | 
 |  | 
 |     Support for ARB_fragment_program_shadow is assumed, but not required. | 
 |  | 
 |     Support for EXT_framebuffer_object is assumed, but not required. | 
 |  | 
 |     Written based on the wording of the OpenGL 2.0 specification and | 
 |     ARB_fragment_program_shadow but not dependent on them. | 
 |  | 
 | Overview | 
 |  | 
 |     There are a number of circumstances where an application may wish to | 
 |     blend two textures out of a larger set of textures.  Moreover, in some | 
 |     cases the selected textures may vary on a per-fragment basis within | 
 |     a polygon.  Several examples include: | 
 |  | 
 |        1. High dynamic range textures.  The application stores several | 
 |        different "exposures" of an image as different textures.  On a | 
 |        per-fragment basis, the application selects which exposures are | 
 |        used. | 
 |  | 
 |        2. A terrain engine where the altitude of a point determines the | 
 |        texture applied to it.  If the transition is from beach sand to | 
 |        grass to rocks to snow, the application will store each texture | 
 |        in a different texture map, and dynamically select which two | 
 |        textures to blend at run-time. | 
 |  | 
 |        3. Storing short video clips in textures.  Each depth slice is a | 
 |        single frame of video. | 
 |  | 
 |     Several solutions to this problem have been proposed, but they either | 
 |     involve using a separate texture unit for each texture map or using 3D | 
 |     textures without mipmaps.  Both of these options have major drawbacks. | 
 |  | 
 |     This extension provides a third alternative that eliminates the major | 
 |     drawbacks of both previous methods.  A new texture target, | 
 |     TEXTURE_2D_STACK, is added that functions identically to TEXTURE_3D in | 
 |     all aspects except the sizes of the non-base level images.  In | 
 |     traditional 3D texturing, the size of the N+1 LOD is half the size | 
 |     of the N LOD in all three dimensions.  For the TEXTURE_2D_STACK target, | 
 |     the height and width of the N+1 LOD is halved, but the depth is the | 
 |     same for all levels of detail. The texture then becomes a "stack" of | 
 |     2D textures.  The per-fragment texel is selected by the R texture | 
 |     coordinate. | 
 |  | 
 |     References: | 
 |  | 
 |         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011557 | 
 |         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=000516 | 
 |         http://www.opengl.org/discussion_boards/cgi_directory/ultimatebb.cgi?ubb=get_topic;f=3;t=011903 | 
 |         http://www.delphi3d.net/articles/viewarticle.php?article=terraintex.htm | 
 |  | 
 | Issues | 
 |  | 
 |     (1) Is "texture stack" a good name for this functionality? | 
 |  | 
 |         NO.  However, I can't think of anything else that is better. | 
 |  | 
 |     (2) Should the R texture coordinate be treated as normalized or | 
 |     un-normalized?  If it were un-normalized, floor(R) could be thought | 
 |     of as a direct index into the texture stack.  This may be more | 
 |     convenient for applications. | 
 |  | 
 |         RESOLVED.  All texture coordinates are normalized.  The issue of | 
 |         un-normalized texture coordinates has been discussed in the ARB | 
 |         before and should be left for a layered extension. | 
 |  | 
 |     (3) How does LOD selection work for stacked textures? | 
 |  | 
 |         RESOLVED.  For 2D texture stacks the R coordinate is ignored, and | 
 |         the LOD selection equations for 2D textures are used.  For 1D | 
 |         texture stacks the T coordinate is ignored, and the LOD selection | 
 |         equations for 1D textures are used.  The expected usage is in a | 
 |         fragment program with an explicit LOD selection. | 
 |  | 
 |     (4) What is the maximum size of a 2D texture stack?  Is it the same | 
 |     as for a 3D texture, or should a new query be added?  How about for 1D | 
 |     texture stacks? | 
 |  | 
 |         UNRESOLVED. | 
 |  | 
 |     (5) How are texture stacks exposed in GLSL? | 
 |      | 
 |         RESOLVED.  For now, they're not exposed at all.  Mesa doesn't | 
 | 	currently support GLSL, so it's somewhat moot. | 
 | 	 | 
 | 	When this extension is converted to MESA, EXT, or ARB, it is | 
 | 	expected that an additional samplers (e.g., sampler1DStack and | 
 | 	sampler2DStack) and texture lookup functions (e.g., texture1DStack and | 
 | 	texture2Dstack) will be added. | 
 |          | 
 |     (6) Should a 1D texture stack also be exposed? | 
 |  | 
 |         RESOLVED.  For orthogonality, yes. | 
 |  | 
 |     (7) How are stacked textures attached to framebuffer objects? | 
 |  | 
 |         SEMI-RESOLVED.  Slices of TEXTURE_2D_STACK textures are attached in | 
 |         the same manner as slices of traditional 3D textures. | 
 |  | 
 |         TEXTURE_1D_STACK textures are a bit more tricky.  This could be | 
 |         handled one of two ways.  The entire texture could be attached using | 
 |         FramebufferTexture2DEXT, or a new function could be created that | 
 |         would allow the attachment of a single 1D slice of the texture.  The | 
 |         spec currently uses the former, but the later may be more logical. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None | 
 |  | 
 | New Tokens | 
 |  | 
 |     Accepted by the <cap> parameter of Enable, Disable, and IsEnabled, by | 
 |     the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, and | 
 |     GetDoublev, and by the <target> parameter of TexImage3D, GetTexImage, | 
 |     GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and | 
 |     GetTexParameterfv: | 
 |  | 
 |         TEXTURE_1D_STACK_MESAX            0x8759 | 
 |         TEXTURE_2D_STACK_MESAX            0x875A | 
 |  | 
 |     Accepted by the <target> parameter of TexImage3D, | 
 |     GetTexLevelParameteriv, and GetTexLevelParameterfv: | 
 |  | 
 |         PROXY_TEXTURE_1D_STACK_MESAX      0x875B | 
 |         PROXY_TEXTURE_2D_STACK_MESAX      0x875C | 
 |  | 
 |     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, | 
 |     GetFloatv, and GetDoublev | 
 |  | 
 |         TEXTURE_1D_STACK_BINDING_MESAX    0x875D | 
 |         TEXTURE_2D_STACK_BINDING_MESAX    0x875E | 
 |  | 
 |     Accepted by the <textarget> parameter of FramebufferTexture2DEXT: | 
 |  | 
 |         TEXTURE_1D_STACK_MESAX | 
 |  | 
 |     Accepted by the <textarget> parameter of FramebufferTexture3DEXT: | 
 |  | 
 |         TEXTURE_2D_STACK_MESAX | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 2.0 Specification (OpenGL Operation) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 2.0 Specification (Rasterization) | 
 |  | 
 |     -- Section 3.8.8 "Texture Minification" in the section "Scale Factor and Level of Detail" | 
 |  | 
 |        Change the first paragraph (page 172) to say: | 
 |  | 
 |        "Let s(x,y) be the function that associates an s texture coordinate | 
 |        with each set of window coordinates (x,y) that lie within a primitive; | 
 |        define t(x,y) and r(x,y) analogously.  Let u(x,y) = w_t * s(x,y), | 
 |        v(x,y) = h_t * t(x,y), and w(x,y) = d_t * r(x,y), where w_t, h_t, | 
 |        and d_t are as defined by equations 3.15, 3.16, and 3.17 with | 
 |        w_s, h_s, and d_s equal to the width, height, and depth of the | 
 |        image array whose level is level_base.  For a one-dimensional | 
 |        texture, define v(x,y) = 0 and w(x,y) = 0; for a two-dimensional | 
 |        texture or a 2D texture stack, define w(x,y) = 0..." | 
 |  | 
 |     -- Section 3.8.8 "Texture Minification" in the section "Mipmapping" | 
 |  | 
 |        After the first paragraph (page 175) add: | 
 |  | 
 |        "For TEXTURE_2D_STACK_MESAX textures, d_b is always treated as | 
 |        zero, regardless of the actual value, when performing mipmap | 
 |        calculations." | 
 |  | 
 |     -- Section 3.8.15 "Texture Application" | 
 |  | 
 |        Change the first paragraph (page 189) to say: | 
 |  | 
 |        "Texturing is enabled or disabled using the generic Enable and Disable | 
 |        commands, respectively, with the symbolic constants TEXTURE_1D, | 
 |        TEXTURE_2D, TEXTURE_3D, TEXTURE_CUBE_MAP, TEXTURE_1D_STACK_MESAX, or | 
 |        TEXTURE_2D_STACK_MESAX to enable one-, two-, three-dimensional, cube | 
 |        map, or 2D texture stack texture, respectively.  If both two- and | 
 |        one-dimensional textures are enabled, the two-dimensional texture is | 
 |        used.  If the three-dimensional and either of the two- or one- | 
 |        dimensional textures is enabled, the three-dimensional texture is | 
 |        used.  If the cube map texture and any of the three-, two-, or one- | 
 |        dimensional textures is enabled, then cube map texturing is used.  If | 
 |        1D texture stack is enabled and any of cube map, three-, two-, or | 
 |        one-dimensional textures is enabled, 2D texture stack texturing is | 
 |        used.  If 2D texture stack is enabled and any of cube map, three-, | 
 |        two-, one-dimensional textures or 1D texture stack is enabled, 2D | 
 |        texture stack texturing is used..." | 
 |  | 
 |     -- Section 3.11.2 of ARB_fragment_program (Fragment Program Grammar and Restrictions): | 
 |  | 
 |        (mostly add to existing grammar rules) | 
 |  | 
 |        <optionName>           ::= "MESAX_texture_stack" | 
 |  | 
 |        <texTarget>            ::= "1D" | 
 |                                | "2D" | 
 |                                | "3D" | 
 |                                | "CUBE" | 
 |                                | "RECT" | 
 |                                | "1D_STACK" | 
 |                                | "2D_STACK" | 
 |  | 
 |     -- Add Section 3.11.4.5.4 Texture Stack Option | 
 |  | 
 |        "If a fragment program specifies the "MESAX_texture_stack" program | 
 |        option, the <texTarget> rule is modified to add the texture targets | 
 |        1D_STACK and 2D_STACK (See Section 3.11.2)." | 
 |  | 
 |     -- Modify Section 3.11.6  Fragment Program Texture Instruction Set | 
 |  | 
 |        (replace 1st and 2nd paragraphs with the following paragraphs) | 
 |  | 
 |       "The first three texture instructions described below specify the | 
 |       mapping of 4-tuple input vectors to 4-tuple output vectors. | 
 |       The sampling of the texture works as described in section 3.8, | 
 |       except that texture environments and texture functions are not | 
 |       applicable, and the texture enables hierarchy is replaced by explicit | 
 |       references to the desired texture target (i.e., 1D, 2D, 3D, cube map, | 
 |       rectangle, 1D_STACK, 2D_STACK).  These texture instructions specify | 
 |       how the 4-tuple is mapped into the coordinates used for sampling.  The | 
 |       following function is used to describe the texture sampling in the | 
 |       descriptions below:  | 
 |  | 
 |          vec4 TextureSample(float s, float t, float r, float lodBias, | 
 |                             int texImageUnit, enum texTarget); | 
 |  | 
 |       Note that not all three texture coordinates, s, t, and r, are | 
 |       used by all texture targets.  In particular, 1D texture targets only | 
 |       use the s component.  2D, RECT (non-power-of-two), and 1D_STACK texture | 
 |       targets only use the s and t components.  SHADOW1D texture | 
 |       targets only use the s and r components.  The descriptions of the | 
 |       texture instructions below supply all three components, as would | 
 |       be the case with CUBE, 3D, 2D_STACK, SHADOW2D, and SHADOWRECT targets." | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 2.0 Specification (Per-Fragment Operations) | 
 |  | 
 |     -- 4.4.2.3 Attaching Texture Images to a Framebuffer | 
 |  | 
 |        Change the sixth paragraph to say: | 
 |  | 
 |        "If <textarget> is TEXTURE_RECTANGLE_ARB, then <level> must be zero. | 
 |        If <textarget> is TEXTURE_3D or TEXTURE_2D_STACK , then <level> must | 
 |        be greater than or equal to zero and less than or equal to log base 2 | 
 |        of MAX_3D_TEXTURE_SIZE..." | 
 |  | 
 |        Change the ninth paragraph to say: | 
 |  | 
 |        "For FramebufferTexture2DEXT, if <texture> is not zero, then | 
 |        <textarget> must be one of: TEXTURE_2D, TEXTURE_1D_STACK, | 
 |        TEXTURE_RECTANGLE_ARB, TEXTURE_CUBE_MAP_POSITIVE_X, | 
 |        TEXTURE_CUBE_MAP_POSITIVE_Y, TEXTURE_CUBE_MAP_POSITIVE_Z, | 
 |        TEXTURE_CUBE_MAP_NEGATIVE_X, TEXTURE_CUBE_MAP_NEGATIVE_Y, or | 
 |        TEXTURE_CUBE_MAP_NEGATIVE_Z." | 
 |  | 
 |        Change the tenth paragraph to say: | 
 |  | 
 |        "For FramebufferTexture3DEXT, if <texture> is not zero, then | 
 |        <textarget> must be TEXTURE_3D or TEXTURE_2D_STACK." | 
 |  | 
 | 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) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Appendix A of the OpenGL 2.0 Specification (Invariance) | 
 |  | 
 |     None | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None | 
 |  | 
 | GLX Protocol | 
 |  | 
 |     None | 
 |  | 
 | Dependencies on ARB_fragment_program | 
 |  | 
 |     If ARB_fragment_program is not supported, the changes to section 3.11 | 
 |     should be ignored. | 
 |  | 
 | Dependencies on EXT_framebuffer_object | 
 |  | 
 |     If EXT_framebuffer_object is not supported, the changes to section | 
 |     4.4.2.3 should be ignored. | 
 |  | 
 | Errors | 
 |  | 
 |     None | 
 |  | 
 | New State | 
 |  | 
 |     None | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None | 
 |  | 
 | Revision History | 
 |  | 
 |     ||2005/11/15||0.1||idr||Initial draft version.|| | 
 |     ||2005/12/07||0.2||idr||Added framebuffer object interactions.|| | 
 |     ||2005/12/12||0.3||idr||Updated fragment program interactions.|| |