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