Name NV_texgen_emboss Name Strings GL_NV_texgen_emboss Contact Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com) Notice Copyright NVIDIA Corporation, 1999, 2001. IP Status NVIDIA Proprietary. Status Discontinued. NVIDIA no longer supports this extension in driver updates after November 2002. Instead, use either ARB_vertex_program & NV_vertex_program. Version NVIDIA Date: January 3, 2003 $Date$ $Revision$ $Id: //sw/main/docs/OpenGL/specs/old/GL_NV_texgen_emboss.txt#2 $ Number 193 Dependencies ARB_multitexture. Written based on the wording of the OpenGL 1.2 specification and the ARB_multitexture extension. Overview This extension provides a new texture coordinate generation mode suitable for multitexture-based embossing (or bump mapping) effects. Given two texture units, this extension generates the texture coordinates of a second texture unit (an odd-numbered texture unit) as a perturbation of a first texture unit (an even-numbered texture unit one less than the second texture unit). The perturbation is based on the normal, tangent, and light vectors. The normal vector is supplied by glNormal; the light vector is supplied as a direction vector to a specified OpenGL light's position; and the tanget vector is supplied by the second texture unit's current texture coordinate. The perturbation is also scaled by program-supplied scaling constants. If both texture units are bound to the same texture representing a height field, by subtracting the difference between the resulting two filtered texels, programs can achieve a per-pixel embossing effect. Issues Can you do embossing on any texture unit? NO. Just odd numbered units. This meets a constraint of the proposed hardware implementation, and because embossing takes two texture units anyway, it shouldn't be a real limitation. Can you just enable one coordinate of a texture unit for embossing? Yes but NOT REALLY. The texture coordinate generation formula is specified such that only when ALL the coordinates are enabled and are using embossing, do you get the embossing computation. Otherwise, you get undefined values for texture coordinates enabled for texture coordinate generation and setup for embossing. Does the light specified have to be enabled for embossing to work? Yes, currently. But perhaps we could require implementations to enable a phantom light (the light colors would be black). Could the emboss constant just be the reciprocal of the width and height of the texture units texture if that's what the programmer will have it be most of the time? NO. Too much work and there may be reasons for the programmer to control this. OpenGL's base texture environment functionality isn't powerful enough to do the subtraction needed for embossing. Where would you get powerful enough texture environment functionality. Another extension. Try NV_register_combiners. What is the interpretation of CT? For the purposes of embossing, CT should be thought of as the vertex's tangent vector. This tangent vector indicates the direction on the "surface" where PCTs is not changing and PCTt is increasing. Are the CT and PCT variables the user-supplied current texture coordinates? YES. Except when the texture unit's texture coordinate evaluator is enabled, then CT and PCT use the respective evaluated texture coordinates. This extension specification's language "Denote as CT the texture unit's current texture coordinates" and "Denote as PCT the previous texture unit's current texture coordinates" refers to the "current texture coordinates" OpenGL state which is the state specified via glTexCoord. Plus the exception for evaluators. To be explicit, PCT is NOT the result of texgen or the texture matrix. Likewise, CT is NOT the result of texgen or the texture matrix. PCT and CT are the respective texture unit's evaluated texture coordinate if the vertex is evaluated with texture coordinate evaluation enabled, otherwise if the vertex is generated via vertex arrays with the respective texture coordinate array enabled, the texture coordinate from the texture coordinate array, otherwise the respective current texture coordinate is used. New Procedures and Functions None New Tokens Accepted by the parameters of TexGend, TexGenf, and TexGeni when parameter is TEXTURE_GEN_MODE: EMBOSS_MAP_NV 0x855F When the parameter of TexGendv, TexGenfv, and TexGeniv is TEXTURE_GEN_MODE, then the array may also contain EMBOSS_MAP_NV. Accepted by the parameters of GetTexGendv, GetTexGenfv, GetTexGeniv, TexGend, TexGendv, TexGenf, TexGenfv, TexGeni, and TexGeniv: EMBOSS_LIGHT_NV 0x855D EMBOSS_CONSTANT_NV 0x855E Additions to Chapter 2 of the 1.2 Specification (OpenGL Operation) -- Section 2.10.4 "Generating Texture Coordinates" Change the last sentence in the 1st paragraph to: "If is TEXTURE_GEN_MODE, then either points to or is an integer that is one of the symbolic constants OBJECT_LINEAR, EYE_LINEAR, SPHERE_MAP, or EMBOSS_MAP_NV." Add these paragraphs after the 4th paragraph: "When used with a suitable texture, suitable explicit texture coordinates, a suitable (extended) texture environment, suitable lighting parameters, and suitable embossing parameters, calling TexGen with TEXTURE_GEN_MODE indicating EMBOSS_MAP_NV can simulate the lighting effect of embossing on a polygon. The error INVALID_ENUM occurs when the active texture unit has an even number. The emboss constant and emboss light parameters for controlling the EMBOSS_MAP_NV mode are specified by calling TexGen with pname set to EMBOSS_CONSTANT_NV and EMBOSS_LIGHT_NV respectively. When pname is EMBOSS_CONSTANT_NV, param or what params points to is a scalar value. An error INVALID_ENUM occurs if pname is EMBOSS_CONSTANT_NV and coord is R or Q. An error INVALID_ENUM also occurs if pname is EMBOSS_CONSTANT_NV and the active texture unit number is even. When pname is EMBOSS_LIGHT_NV, param or what params points to is a symbolic constant of the form LIGHTi, indicating that light i is to have the specified parameter set. An error INVALID_ENUM occurs if pname is EMBOSS_LIGHT_NV and coord is R or Q. An error INVALID_ENUM occurs if pname is EMBOSS_LIGHT_NV and the active texture unit number is even. An error INVALID_ENUM occurs if pname is EMBOSS_LIGHT_NV and the value i for LIGHTi is negative or is greater than or equal to the value of MAX_LIGHTS. If TEXTURE_GEN_MODE indicates EMBOSS_MAP_NV, the generation function for the coordinates S, T, R, and Q is computed as follows. Denote as L the light direction vector from the vertex's eye position to the position of the light specified by the coordinate's EMBOSS_LIGHT_NV state (the direction vector is computed as described in Section 3.13.1). Denote as N the current normal after transformation to eye coordinates. Denote as CT the texture unit's current texture coordinates transformed to eye coordinates by normal transformation (as described in Section 3.10.3) and normalized. However, if the vertex is evaluated (as described in Section 5.1) and the texture unit's texture coordinate map is enabled, use the texture unit's evaluated texture coordinate to compute CT. Denote as B the cross product of N and the vector of CT. Bx = Ny*CTr - CTt*Nz By = Nz*CTs - CTr*Nx Bz = Nx*CTt - CTs*Ny Denote as BN the normalized version of the vector B. BNx = Bx / sqrt(Bx*Bx + By*By + Bz*Bz); BNy = By / sqrt(Bx*Bx + By*By + Bz*Bz); BNz = Bz / sqrt(Bx*Bx + By*By + Bz*Bz); Denote as T the cross product of B and N. Tx = BNy*Nz - Ny*BNz Ty = BNz*Nx - Nz*BNx Tz = BNx*Ny - Nx*BNy Observe that BN and T are orthonormal. Denote as PCT the previous texture unit's current texture coordinates. If the number of the texture unit for the texture coordinates being generated is n, then the previous texture unit is texture unit number n-1. Note that n is restricted to be odd. However, if the vertex is evaluated (as described in Section 5.1) and the previous texture unit's texture coordinate map is enabled, use the previous texture unit's evaluated texture coordinate to compute PCT. Denote Ks as the S coordinate's EMBOSS_CONSTANT_NV state. Denote Kt as the T coordinate's EMBOSS_CONSTANT_NV state. These constants should typically be set to the reciprocal of the width and height respectively of the texture map used for embossing. Denote E as follows: Es = PCTs + Ks * (Lx*BNx + Ly*BNy + Lz*BNz) * PCTq Et = PCTt - Kt * (Lx*Tx + Ly*Ty + Lz*Tz) * PCTq Er = PCTr Eq = PCTq Then the value assigned to an s, t, r, and q coordinates are Es, Et, Er, and Eq respectively. However, for this assignment to occur, the following three conditions must be met. First, all the texture coordinate generation modes of all the texture coordinates (S, T, R, and Q) of the texture unit must be set to EMBOSS_MAP_NV. Second, all the texture coordinate generation modes of the texture unit must be enabled. Third, the EMBOSS_LIGHT_NV parameters of coordinates S and T must be identical and the light and lighting must be enabled. If these conditions are not met, the values of all coordinates in the texture unit with the EMBOSS_MAP_NV mode are undefined." The last paragraph's first sentence should be changed to: "The state required for texture coordinate generation comprises a five-valued integer for each coordinate indicating coordinate generation mode, and a bit for each coordinate to indicate whether texture coordinate generation is enabled or disabled. In addition, four coefficients are required for the four coordinates for each of EYE_LINEAR and OBJECT_LINEAR; also, an emboss constant and emboss light are required for each of the four coordinates.... The initial values for emboss constants and emboss lights are 1.0 and LIGHT0 respectively." Additions to Chapter 3 of the 1.2 Specification (Rasterization) None Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the 1.2 Specification (Special Functions) None Additions to Chapter 6 of the 1.2 Specification (State and State Requests) None Additions to the AGL/GLX/WGL Specifications None GLX Protocol None Errors INVALID_ENUM is generated when TexGen is called with a of TEXTURE_GEN_MODE, a value or value of what points to of EMBOSS_MAP_NV, and the active texture unit is even. INVALID_ENUM is generated when TexGen is called with a of EMBOSS_CONSTANT_NV and the active texture unit is even. INVALID_ENUM is generated when TexGen is called with a of EMBOSS_LIGHT_NV and the active texture unit is even. INVALID_ENUM is generated when TexGen is called with a of R or Q when indicates EMBOSS_CONSTANT_NV. INVALID_ENUM is generated when TexGen is called with a of R or Q when indicates EMBOSS_LIGHT_NV. INVALID_ENUM is generated when TexGen is called with a of EMBOSS_LIGHT_NV and the value of i for the parameter LIGHTi is negative or is greater than or equal to the value of MAX_LIGHTS. New State (table 6.14, p204) change the entry for TEXTURE_GEN_MODE to: Get Value Type Get Command Initial Value Description Sec Attribute --------- ---- ----------- ------------- ----------- ------ --------- TEXTURE_GEN_MODE 4xZ5 GetTexGeniv EYE_LINEAR Function used for 2.10.4 texture texgen (for s,t,r, and q) EMBOSS_CONSTANT_NV 4xR GetTexGenfv 1.0 Scaling constant 2.10.4 texture for emboss texgen EMBOSS_LIGHT_NV 4xZ8* GetTexGeniv LIGHT0 Light used for 2.10.4 texture embossing. When ARB_multitexture is supported, the Type column is per-texture unit. (the TEXTURE_GEN_MODE type changes from 4xZ3 to 4xZ5) New Implementation State None Revision History 2001/02/20 - Status changed to deprecated. 1/3/2003 changed status to "discontinued"