Name EXT_texture3D Name Strings GL_EXT_texture3D Version $Date: 1996/04/05 19:17:05 $ $Revision: 1.22 $ Number 6 Dependencies EXT_abgr affects the definition of this extension EXT_texture is required Overview This extension defines 3-dimensional texture mapping. In order to define a 3D texture image conveniently, this extension also defines the in-memory formats for 3D images, and adds pixel storage modes to support them. One important application of 3D textures is rendering volumes of image data. New Procedures and Functions void TexImage3DEXT(enum target, int level, enum internalformat, sizei width, sizei height, sizei depth, int border, enum format, enum type, const void* pixels); New Tokens Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, and by the parameter of PixelStore: PACK_SKIP_IMAGES_EXT 0x806B PACK_IMAGE_HEIGHT_EXT 0x806C UNPACK_SKIP_IMAGES_EXT 0x806D UNPACK_IMAGE_HEIGHT_EXT 0x806E Accepted by the parameter of Enable, Disable, and IsEnabled, by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev, and by the parameter of TexImage3DEXT, GetTexImage, GetTexLevelParameteriv, GetTexLevelParameterfv, GetTexParameteriv, and GetTexParameterfv: TEXTURE_3D_EXT 0x806F Accepted by the parameter of TexImage3DEXT, GetTexLevelParameteriv, and GetTexLevelParameterfv: PROXY_TEXTURE_3D_EXT 0x8070 Accepted by the parameter of GetTexLevelParameteriv and GetTexLevelParameterfv: TEXTURE_DEPTH_EXT 0x8071 Accepted by the parameter of TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv: TEXTURE_WRAP_R_EXT 0x8072 Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: MAX_3D_TEXTURE_SIZE_EXT 0x8073 Additions to Chapter 2 of the GL Specification (OpenGL Operation) None Additions to Chapter 3 of the GL Specification (Rasterization) The pixel storage modes are augmented to support 3D image formats in memory. Table 3.1 is replaced with the table below: Parameter Name Type Initial Value Valid Range -------------- ---- ------------- ----------- UNPACK_SWAP_BYTES boolean FALSE TRUE/FALSE UNPACK_LSB_FIRST boolean FALSE TRUE/FALSE UNPACK_ROW_LENGTH integer 0 [0, infinity] UNPACK_SKIP_ROWS integer 0 [0, infinity] UNPACK_SKIP_PIXELS integer 0 [0, infinity] UNPACK_ALIGNMENT integer 4 1, 2, 4, 8 UNPACK_IMAGE_HEIGHT_EXT integer 0 [0, infinity] UNPACK_SKIP_IMAGES_EXT integer 0 [0, infinity] Table 3.1: PixelStore parameters pertaining to one or more of DrawPixels, TexImage1D, TexImage2D, and TexImage3DEXT. When TexImage3DEXT is called, the groups in memory are treated as being arranged in a sequence of adjacent rectangles. Each rectangle is a 2-dimensional image, whose size and organization are specified by the and parameters to TexImage3DEXT. The values of UNPACK_ROW_LENGTH and UNPACK_ALIGNMENT control the row-to-row spacing in these images in exactly the manner described in the GL Specification for 2-dimensional images. If the value of UNPACK_IMAGE_HEIGHT_EXT is not positive, then the number of rows in each 2-dimensional image is ; otherwise the number of rows is UNPACK_IMAGE_HEIGHT_EXT. Each 2-dimensional image comprises an integral number of rows, and is exactly adjacent to its neighbor images. The mechanism for selecting a sub-volume of a 3-dimensional image builds on the mechanism for selecting a sub-rectangle of groups from a larger containing rectangle. If UNPACK_SKIP_IMAGES_EXT is positive, the pointer is advanced by UNPACK_SKIP_IMAGES_EXT times the number of elements in one 2-dimensional image. Then 2-dimensional images are processed, each having a subimage extracted in the manner described in the GL Specification for 2-dimensional images. The selected groups are processed as though they were part of a 2-dimensional image. When the final R, G, B, and A components have been computed for a group, they are assigned to components of a texel as described by Table 3.6 in the EXT_texture extension. Counting from zero, each resulting Nth texel is assigned internal integer coordinates [i,j,k], where i = (N mod width) - border j = ((N div width) mod height) - border k = ((N div (width * height)) mod depth) - border and the div operator performs integer division with truncation. Thus the last 2-dimensional image of the 3-dimensional image is indexed with the highest value of k. The dimensions of the 3-dimensional texture image are x x . Integer values that will represent the base-2 logarithm of these dimensions are n, m, and l, defined such that width = 2**n + (2 * border) height = 2**m + (2 * border) depth = 2**l + (2 * border) It is acceptable for an implementation to vary its allocation of internal component resolution based any TexImage3DEXT parameter, but the allocation must not be a function of any other factor, and cannot be changed once it is established. In particular, allocations must be invariant -- the same allocation must be made each time a texture image is specified with the same parameter values. Provision is made for an application to determine what component resolutions are available without having to fully specify the texture (see below). Texture Wrap Modes ------------------ The additional token value TEXTURE_WRAP_R_EXT is accepted by TexParameteri, TexParameterv, TexParameteriv, and TexParameterfv, causing table 3.7 to be replaced with the table below: Name Type Legal Values ---- ---- ------------ TEXTURE_WRAP_S integer CLAMP, REPEAT TEXTURE_WRAP_T integer CLAMP, REPEAT TEXTURE_WRAP_R_EXT integer CLAMP, REPEAT TEXTURE_MIN_FILTER integer NEAREST, LINEAR, NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, LINEAR_MIPMAP_LINEAR TEXTURE_MAG_FILTER integer NEAREST, LINEAR TEXTURE_BORDER_COLOR 4 floats any 4 values in [0,1] Table 3.7: Texture parameters and their values. If TEXTURE_WRAP_R_EXT is set to REPEAT, then the GL ignores the integer part of R coordinates, using only the fractional part. CLAMP causes R to be clamped to the range [0, 1]. The initial state is for TEXTURE_WRAP_R_EXT to be REPEAT. Texture Minification -------------------- Continuous coordinates s, t, u, and v are defined in figure 3.10 of the GL Specification. To discuss 3-dimensional texture mapping, coordinates r and w are defined similarly. Coordinate w is equal to -border at the "far" edge of the 3D image, understanding the image to be right-handed, with k values increasing toward the viewer. It has value depth+border at the near edge of this volume. Coordinate r has the same direction, but is normalized so that it is 0.0 and 1.0 at the "far" and "near" edges of a borderless volume. If the volume has a border, the 0.0 and 1.0 mappings of r continue to bound the core image. The formulas for p, used to determine the level of detail, are modified by including dw/dx and dw/dy terms in the obvious ways. Equation 3.7 sums (dw/dx)**2 into the left term, and (dw/dy)**2 into the right term. Equation 3.8 has ((dw/dx * Dx + dw/dy * Dy)**2 added to the two terms under the square root. The requirements for the function f(x,y) become 1. f(x, y) is continuous and monotonically increasing in each of |du/dx|, |du/dy|, |dv/dx|, |dv/dy|, |dw/dx|, and |dw/dy|. 2. Let m_u = max(|du/dx|, |du/dy|) m_v = max(|dv/dx|, |dv/dy|) m_w = max(|dw/dx|, |dw/dy|) Then max(m_u, m_v, m_w) <= f(x, y) <= m_u + m_v + m_w The i and j coordinates of the texel selected for NEAREST filtering are as defined in equations 3.9 and 3.10 of the GL Specification. Coordinate k is computed as / floor(w), r < 1 k = ( \ 2**l - 1, r = 1 A 2x2x2 cube of texels is selected for LINEAR filtering. The i and j coordinates of these texels are computed as defined in the GL Specification for 2-dimensional images. The k coordinates are computed as / floor(w - 1/2) mod 2**l, TEXTURE_WRAP_R_EXT is REPEAT k0 = ( \ floor(w - 1/2), TEXTURE_WRAP_R_EXT is CLAMP / (k0 + 1) mod 2**l, TEXTURE_WRAP_R_EXT is REPEAT k1 = ( \ k0 + 1, TEXTURE_WRAP_R_EXT is CLAMP Let A = frac(u - 1/2) B = frac(v - 1/2) C = frac(w - 1/2) where frac(x) denotes the fractional part of x. Let T[i,j,k] be the texel at location [i,j,k] in the texture image. Then the texture value, T, is found as T = (1-A) * (1-B) * (1-C) * T[i0,j0,k0] + A * (1-B) * (1-C) * T[i1,j0,k0] + (1-A) * B * (1-C) * T[i0,j1,k0] + A * B * (1-C) * T[i1,j1,k0] + (1-A) * (1-B) * C * T[i0,j0,k1] + A * (1-B) * C * T[i1,j0,k1] + (1-A) * B * C * T[i0,j1,k1] + A * B * C * T[i1,j1,k1] for a 3-dimensional texture. If any of the selected T[i,j,k] in the above equation refer to a border texel with unspecified value, then the border color given by the current setting of TEXTURE_BORDER_COLOR is used instead of the unspecified value or values. Mipmapping ---------- TEXTURE_MIN_FILTER values NEAREST_MIPMAP_NEAREST, NEAREST_MIPMAP_LINEAR, LINEAR_MIPMAP_NEAREST, and LINEAR_MIPMAP_LINEAR each require the use of a mipmap. A 3-dimensional mipmap is an ordered set of arrays representing the same image; each array has a resolution lower than the previous one. If the texture, excluding is border, has dimensions 2**n x 2**m x 2**l, then there are exactly max(n, m, l) + 1 mipmap arrays. Each subsequent array has dimensions size(i-1) x size(j-1) x size(k-1) where the dimensions of the previous array are size(i) x size(j) x size(k) and / 2**x + 2*border, x > 0 size(x) = ( \ 1 + 2*border, x <= 0 Each array in a 3-dimensional mipmap is transmitted to the GL using TexImage3DEXT; the array being set is indicated with the parameter. The rules for completeness of the set of arrays are as described in the GL Specification, augmented in EXT_texture. The rules for mipmap array selection, and for filtering of the two selected arrays, are also as described in the GL Specification. Finally, the rules for texture magnification are also exactly as described in the GL Specification. Texture Application ------------------- 3-dimensional texture mapping is enabled and disabled using the generic Enable and Disable commands, with specified as TEXTURE_3D_EXT. If either or both TEXTURE_1D or TEXTURE_2D are enabled at the same time as TEXTURE_3D_EXT, the 3-dimensional texture is used. Query support ------------- The proxy texture PROXY_TEXTURE_3D_EXT can be used by applications to query an implementations maximum configurations just as it can be for 1-dimensional and 2-dimensional textures. Alternate sets of partial per-level texture state are defined for the proxy texture PROXY_TEXTURE_3D_EXT. Specifically, TEXTURE_WIDTH, TEXTURE_HEIGHT, TEXTURE_DEPTH_EXT, TEXTURE_BORDER, TEXTURE_COMPONENTS, TEXTURE_RED_SIZE_EXT, TEXTURE_GREEN_SIZE_EXT, TEXTURE_BLUE_SIZE_EXT, TEXTURE_ALPHA_SIZE_EXT, TEXTURE_LUMINANCE_SIZE_EXT, and TEXTURE_INTENSITY_SIZE_EXT are maintained the the proxy texture. When TexImage3DEXT is called with set to PROXY_TEXTURE_3D_EXT, these proxy state values are always respecified, even if the texture is too large to actually be used. If the texture is too large, all of these state variables are set to zero. If the texture could be accommodated by TexImage3DEXT called with TEXTURE_3D_EXT, these values are set as though TEXTURE_3D_EXT were being defined. All of these state value can be queried with GetTexLevelParameteriv with set to PROXY_TEXTURE_3D_EXT. Calling TexImage3DEXT with PROXY_TEXTURE_3D_EXT has no effect on the actual 3-dimensional texture or its state. There is no image associated with PROXY_TEXTURE_3D_EXT. Therefore PROXY_TEXTURE_3D_EXT cannot be used as a texture, and its image must never be queried using GetTexImage. (The error INVALID_ENUM results if this is attempted.) Likewise, there is no nonlevel-related state associated with a proxy texture, so calling GetTexParameteriv or GetTexParameterfv with PROXY_TEXTURE_3D_EXT results in the error INVALID_ENUM. Additions to Chapter 4 of the GL Specification (Per-Fragment Operations and the Framebuffer) None Additions to Chapter 5 of the GL Specification (Special Functions) TexImage3DEXT with a proxy target is not included in display lists, but is instead executed immediately. Additions to Chapter 6 of the GL Specification (State and State Requests) 3-dimensional texture images are queried using GetTexImage with its parameter set to TEXTURE_3D_EXT. The assignment of texel component values to the initial R, G, B, and A components of a pixel group is described in EXT_texture. Pixel transfer and pixel storage operations are applied as if the image were 2-dimensional, except that the additional pixel storage state values PACK_IMAGE_HEIGHT_EXT and PACK_SKIP_IMAGES_EXT affect the storage of the image into memory. The correspondence of texels to memory locations is as defined for TexImage3DEXT above, substituting PACK* state for UNPACK* state in all occurrences. Additions to the GLX Specification None GLX Protocol A new GL rendering command is added. This command contains pixel data; thus it is sent to the server either as part of a glXRender request or as part of a glXRenderLarge request: TexImage3DEXT 2 84+n+p rendering command length 2 4114 rendering command opcode 1 BOOL swap_bytes 1 BOOL lsb_first 2 unused 4 CARD32 row_length 4 CARD32 image_height 4 CARD32 image_depth 4 CARD32 skip_rows 4 CARD32 skip_images 4 CARD32 skip_volumes 4 CARD32 skip_pixels 4 CARD32 alignment 4 ENUM target 4 INT32 level 4 ENUM internalformat 4 INT32 width 4 INT32 height 4 INT32 depth 4 INT32 size4d 4 INT32 border 4 ENUM format 4 ENUM type 4 CARD32 null_image n LISTofBYTE pixels p unused, p=pad(n) If the command is encoded in a glXRenderLarge request, the command opcode and command length fields above are expanded to 4 bytes each: 4 88+n+p rendering command length 4 4114 rendering command opcode If < 0, < 0, < 0, is invalid or is invalid, then the command is erroneous and n=0. is arranged as a sequence of adjacent rectangles. Each rectangle is a 2-dimensional image, whose structure is determined by the image height and the parameters , , , , , , , , and given in the request. If is not positive then the number of rows (i.e., the image height) is ; otherwise the number of rows is . allows a sub-volume of the 3-dimensional image to be selected. If is positive, then the pointer is advanced by times the number of elements in one 2-dimensional image. Then 2-dimensional images are read, each having a subimage extracted in the manner described in Appendix A of the GLX Protocol Specification. Dependencies on EXT_abgr If EXT_abgr is supported, the parameter of TexImage3DEXT accepts ABGR_EXT. Otherwise it does not. Dependencies on EXT_texture EXT_texture is required. All of the tokens defined by EXT_texture are accepted by the parameter of TexImage3DEXT, with the same semantics that are defined by EXT_texture. The query and error extensions defined by EXT_texture are extended in this document. Errors INVALID_ENUM is generated if is not TEXTURE_3D_EXT or PROXY_TEXTURE_3D_EXT. INVALID_ENUM is generated if the parameter to GetTexParameteriv, GetTexParameterfv or GetTexImage is PROXY_TEXTURE_3D_EXT. INVALID_VALUE is generated if is less than zero INVALID_ENUM is generated if is not ALPHA, RGB, RGBA, LUMINANCE, LUMINANCE_ALPHA, or one of the tokens defined by the EXT_texture extension. (Values 1, 2, 3, and 4 are not accepted as internal formats by TexImage3DEXT). INVALID_VALUE is generated if , , or is less than zero, or cannot be represented as 2**k + 2*border for some integer k. INVALID_VALUE is generated if is not 0 or 1. INVALID_ENUM is generated if is not COLOR_INDEX, RED, GREEN, BLUE, ALPHA, RGB, RGBA, LUMINANCE, or LUMINANCE_ALPHA (or ABGR_EXT if EXT_abgr is supported). INVALID_ENUM is generated if is not UNSIGNED_BYTE, BYTE, UNSIGNED_SHORT, SHORT, UNSIGNED_INT, INT, or FLOAT. INVALID_OPERATION is generated if TexImage3DEXT is called between execution of Begin and the corresponding execution of End. TEXTURE_TOO_LARGE_EXT is generated if the texture as specified cannot be accommodated by the implementation. This error will not occur if none of , , or is greater than MAX_3D_TEXTURE_SIZE_EXT. New State Get Value Get Command Type Initial Value Attribute --------- ----------- ---- ------------- --------- UNPACK_SKIP_IMAGES_EXT GetIntegerv Z+ 0 - UNPACK_IMAGE_HEIGHT_EXT GetIntegerv Z+ 0 - PACK_SKIP_IMAGES_EXT GetIntegerv Z+ 0 - PACK_IMAGE_HEIGHT_EXT GetIntegerv Z+ 0 - TEXTURE_3D_EXT IsEnabled B FALSE texture/enable TEXTURE_WRAP_R_EXT GetTexParameteriv 1 x Z2 REPEAT texture TEXTURE_DEPTH_EXT GetTexLevelParameteriv 1 x 2 x levels x Z+ 0 - (old state with new type information) TEXTURE GetTexImage 3 x 1 x levels x I null - TEXTURE_RED_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_GREEN_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_BLUE_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_ALPHA_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_LUMINANCE_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_INTENSITY_SIZE_EXT GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_WIDTH GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_HEIGHT GetTexLevelParameteriv 2 x 2 x levels x Z+ 0 - TEXTURE_BORDER GetTexLevelParameteriv 3 x 2 x levels x Z+ 0 - TEXTURE_COMPONENTS (1D and 2D) GetTexLevelParameteriv 2 x 2 x levels x Z42 1 - TEXTURE_COMPONENTS (3D) GetTexLevelParameteriv 1 x 2 x levels x Z38 LUMINANCE - TEXTURE_BORDER_COLOR GetTexParameteriv 3 x C 0, 0, 0, 0 texture TEXTURE_MIN_FILTER GetTexParameteriv 3 x Z6 NEAREST_MIPMAP_LINEAR texture TEXTURE_MAG_FILTER GetTexParameteriv 3 x Z2 LINEAR texture TEXTURE_WRAP_S GetTexParameteriv 3 x Z2 REPEAT texture TEXTURE_WRAP_T GetTexParameteriv 2 x Z2 REPEAT texture New Implementation Dependent State Get Value Get Command Type Minimum Value --------- ----------- ---- ------------- MAX_3D_TEXTURE_SIZE_EXT GetIntegerv Z+ 16