XXX - not done yet Name SGIX_fragment_lighting_space Name Strings GL_SGIX_fragment_lighting_space Version $Date: 1998/05/12 23:52:07 $ $Revision: 1.14 $ Number 118 Dependencies EXT_fragment_lighting is required. EXT_coordinate_frame is required. Overview This extension specifies that the fragment lighting vectors including the view vector, light vectors, halfangle vectors and spotlight direction vectors, be transformed into either eye-space, object-space or tangent-space on a per-vertex basis. The default is eye-space. Combined with the ability to take a normal vector from texture memory, as specified by the SGIX_light_texture extension, the ability to transform other shading vectors to the same space as the normal vector allows advanced shading effects such as bump mapping to be realized. The tangent-space transform uses the per-vertex tangent and binormal vector introduced by the EXT_coordinate_frame extension. Issues * A suggestion for a different way to attack this is to introduce the concept of a per-vertex matrix which is applied to lighting vectors. Coupled with a new matrix-gen function, we could generate the necessary per-vertex matrices. * Are we really dependent upon fragment light? Theoretically, no, but doing lighting in a space other than eye-space doesn't help one much unless we can do something like get normal vectors from texture. For that reason it doesn't seem to make sense to burden per-vertex lighting with this generality. * If we are dependent upon fragment light are we not also dependent upon SGIX_light_texture? It would seem to make little sense to implement light_space and not light texture because the combination of the two of them is what makes bump mapping possible. But since there is nothing gained by making light_space dependent upon light_texture we won't make it dependent upon light_texture New Procedures and Functions FragmentLightSpaceSGIX(enum space); New Tokens Accepted by the parameter of FragmentLightSpaceSGIX: EYE_SPACE_SGIX 0x8436 TANGENT_SPACE_SGIX 0x8437 OBJECT_SPACE_SGIX 0x8438 Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: FRAGMENT_LIGHT_SPACE_SGIX 0x843D Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation) The fragment_light.spec section 3.9.2 Lighting Operation is amended: If FragmentLightSpaceSGIX specifies EYE_SPACE_SGIX then calculations are carried out in eye space. If FragmentLightSpaceSGIX specifies TANGENT_SPACE_SGIX then calculations are carried out in tangent space by constructing an orthonormal basis from the per-vertex tangent, binormal and normal vectors and using that matrix to transform eye-space shading vectors into tangent space on a per-vertex basis. The vectors are normalized before being passed to the rasterization stage where the fragment lighting calculations are performed. The matrix is constructed as follows: if NORMALIZE is enabled, b = cross(normal,tangent); t = cross(b,n); t = normalize(t); b = normalize(b); n = normalize(normal); else t = tangent b = binormal n = normal the matrix M = ( t - - ) ( b - - ) ( n - - ) maps (1,0,0) to t, (0,1,0) to b, (0,0,1) to n. Because it is an orthogonal matrix, its inverse is its transpose: Mi = ( t b n ) ( | | | ) ( | | | ) and maps t to (1,0,0), b to (0,1,0), n to (0,0,1), ie, maps vectors to tangent space. Any shading vectors required by the fragment lighting rasterization stages, which could include the view vector V, light vector VPli, halfangle vector hi and spotlight direction vector, sdli, are first computed in eye space on a per-vertex basis and then transformed by Mi to the tangent space shading vectors, Vts, Ltsi, Htsi, sdltsi. if FragmentLightSpaceSGIX specifies OBJECT_SPACE_SGIX then fragment lighting calculations can be carried out in object space by transforming the eye-space shading vectors by the inverse of the current modelview matrix and subsequently normalizing them. Additions to Chapter 3 of the 1.0 Specification (Rasterization) None Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the 1.0 Specification (Special Functions) None Additions to Chapter 6 of the 1.0 Specification (State and State Requests) tables are extended with state values from New State section Additions to the GLX Specification None GLX Protocol XXX - not yet complete Errors INVALID_ENUM is generated if FragmentLightSpaceSGIX parameter is not EYE_SPACE_SGIX, OBJECT_SPACE_SGIX, or TANGENT_SPACE_SGIX. INVALID_OPERATION is generated if FragmentLightSpaceSGIX is called between the execution of Begin and the corresponding execution of End. New State Get Value Get Command Type Initial Value Attribute --------- ----------- ---- ------------- --------- FRAGMENT_LIGHT_SPACE_SGIX GetIntegerv Z3 EYE_SPACE_SGIX lighting/enable New Implementation Dependent State None