blob: 6cf36d6964d363d9d35e5e542b1b49bd216dab2a [file] [log] [blame]
 XXX - Not complete yet!!! Name SGIX_nonlinear_lighting_pervertex Name Strings GL_SGIX_nonlinear_lighting_pervertex Version \$Date: 1997/09/23 23:20:38 \$ \$Revision: 1.1 \$ Number ??? Dependencies OpenGL 1.1 is required. Overview This extension adds new functionality to the per-vertex lighting model of OpenGL. It facilitates a nonlinear approximation of reflectance functions of materials. This extension is based upon research conducted at Cornell University and detailed in the SIGGRAPH 97 proceedings (LaFortune, pp. 117-126). When active, this reflectance model replaces diffuse and specular (and ambient?) reflection with a single, generalized material description. The fundamental equation for nonlinear reflectance can be expressed as the following weighte dot-product: Fr(u,v) = Ps*(Cx*ux*vx + Cy*uy*vy + Cz*uz*vz)^n Where: u = light vector at a vertex v = eye vector at a vertex Ps = maximum albedo (fully-illuminated material color) C = nonlinear scaling coefficients n = specular exponent (~shininess) The magnitude of the C vector equals (n+2)/2pi and represents the normalization constant. A given material will be influenced by a number Ps, C coeffients (analagous to specular, diffuse, ambient components in the basic OpenGL lighting model). As in the OpenGL 1.1 lighting model, the final color for a point is expressed as a sum of equations of the same format as Fr: Fr(u,v) = Sum(i,N)(Cx,i*ux*vx + Cy,i*uy*vy + Cz,i*uz*vz)^ni Where the reflectance at a point is defined by the sum of N expressions. Each dot product is characterized by the following coefficients: Ci = coefficient vectors with with color absorbed ni = specular exponents In the context of OpenGL, it makes sense to make the magnitude of Ci be (ni+2)/2pi and keep the color (RGBA) vector separate. This extension will be implemented in the OpenGL pipeline directly in place of the per-vertex specular, diffuse lighting. Issues * Should ambient lighting calculations remain active when nonlinear reflectance is enabled? * Should we only allow a single Alpha component to be used, as in the OpenGL 1.1 model? * Because of the potentially large amount of data associated (relative to OpenGL 1.1 materials) with a material, should a "Material Object" extension be considered? * Should Nonlinear Lighting be allowed in Color_Index mode? * Should the vertex colors be clamped positive? This will inhibit multipassing... * Are there any dependencies on other extensions? New Procedures and Functions Because of the potentially large number of nonlinear terms, special "Nonlin" versions of Material, Light have been added in this extension. These functions affect lighting state in a manner identical to Material and Light, with a different calling convention. void NonlinMaterialfvSGIX(enum face, enum pname, int terms, const float *params); void GetNonlinMaterialfvSGIX(enum face, enum pname, int *terms, const float *data); void NonlinLightfvSGIX(enum light, enum pname, int terms, float *params); void GetNonlinLightfvSGIX(enum light, enum pname, int *terms, float *data); New Tokens Accepted by the parameter of Enable, Disable, and IsEnabled, by the parameters of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: NONLIN_LIGHTING_SGIX 0x???? Accepted by the parameter of GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev: MAX_NONLIN_TERMS_SGIX 0x???? MAX_NONLIN_LIGHTS_SGIX 0x????+1 Accepted by the parameter of NonlinMaterialv, NonlinLightv: COLOR_SGIX 0x???? Accepted by the parameter of NonlinMaterialv: WEIGHT_SGIX 0x???? Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) Section 2.13.1 Lighting ... Lighting may be in one of three states: ... 2. Lighting On, Nonlinear Reflectance Disabled. In this state, a vertex's color is found by computing a value given the current lighting parameters and using the specular/diffuse reflectance model. 3. Lighting On, Nonlinear Reflectance Enabled. In this state, a vertex's color is found by computing a value given the current lighting parameters and using the nonlinear reflectance model. Lighting is turned either on or off using the generic Enable or Disable commands with the symbolic value LIGHTING. Nonlinear Reflectance is turned either on or off using the generic Enable or Disable commands with the symbolic value NONLIN_LIGHTING_SGIX. Nonlinear Reflectance has no effect if lighting is off. ... A lighting parameter is one of seven types: color, position, direction, weight, real, int, or boolean. ... A weight parameter consists of 3 floating-point elements, one for each of Cx, Cy, and Cz, in that order. There are no restrictions on the allowable values for the weight parameter. ... An int parameter is one integer value. ... Nonlinear Material Parameters wcm,j weight (0.0,0.0,0.0) jth reflectance weight of material srm,j real 1.0 jth specular exponent of material ccm,j color (0.8,0.8,0.8,1.0) jth color of material tnlm int 0 Maximum (j+1) of material ... Nonlinear Light Source Parameters ncli,j(i=0) color (1.0,1.0,1.0,1.0) jth intensity of light 0 ncli,j(i>0) color (0.0,0.0,0.0,1.0) jth intensity of light i tnll int 0 Maximum (j+1) light ... If nonlinear reflectance is disabled, the color c produced... ...If nonlinear reflectance is enabled, the color c produced by lighting a vertex is given by c = ecm + acm*acs + sum(sum(acm*acli + (fi)(nx*hx*wcmx,j + ny*hy*wcmy,j + nz*hz*wcmzj)^srm,j * ccm,j*ncli,j)) Section 2.13.2 Lighting Parameter Specification ... ...Material... void NonlinMaterial{f}v( enum face, enum pname, int terms, T params ) ; ...Light... void NonlinLight{f}v( enum light, enum pname, int terms, T params ) ; ... ... params is a pointer... terms is an integer indicating how many terms of a nonlinear lighting equation are being specified by a function call. ...For the Material or NonlinMaterial commands, face must be one of... ... Nonlinear Material Parameters(NonlinMaterial) wcm,j WEIGHT 3*terms ccm,j COLOR 4*terms srm,j SHININESS terms tnlm terms 1 ... Nonlinear Light Source Parameters(NonlinLight) ncli,j COLOR 4*terms tnll terms 1 Section 2.13.3 ColorMaterial ... ...by calling Enable or Disable with the symbolic value COLOR_MATERIAL. The error INVALID_OPERATION is generated if COLOR_MATERIAL is Enabled while NONLIN_LIGHTING is enabled. Section 2.14.4 Lighting State ... ...The state required...a bit indicating whether or not NONLINEAR_LIGHTING is enabled, and a single... Additions to Chapter 3 of the 1.1 Specification (Rasterization) None Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations and the Frame Buffer) None Additions to Chapter 5 of the 1.1 Specification (Special Functions) None Additions to Chapter 6 of the 1.1 Specification (State and State Requests) ... void GetNonlinLight{f}v( enum light, enum value, int *terms, T *data ) ; void GetNonlinMaterial{f}v( enum face, enum value, int *terms, T *data ) ; ... GetNonlinLight and GetNonlinMaterial are similar to their GetLight and GetMaterial counterparts, except that they return by reference the number of terms (int *terms) and an array of parameters (T *data). The *data pointer passed to GetNonlinMaterial and GetNonlinLight should point to an array large enough to contain MAX_NONLIN_TERMS*components, where components equals the number of floats comprising a datum. ... W Weight (floating-point Cx, Cy, Cz values) Additions to the GLX Specification TBD Dependencies on SGI_extension_name None? Errors INVALID_OPERATION is generated if the user attempts to enable both COLOR_MATERIAL and NONLINEAR_LIGHTING, irregardless of order. INVALID_ENUM is generated if NonlinLight{f}vSGIX parameter is not COLOR or is not valid (LIGHT{0..MAX_NONLIN_LIGHTS-1}. INVALID_VALUE is generated if NonlinLight{f}vSGIX parameter is outside the range [0..MAX_NONLIN_TERMS). INVALID_OPERATION is generated if the number of terms for an active light differs from the current material, or if the number of terms for SHININESS, WEIGHTS and COLOR differ. This error results from primitive specification. INVALID_ENUM is generated if NonlinMaterial{T}vSGIX parameter is not FRONT, BACK, or FRONT_AND_BACK. INVALID_ENUM is generated if NonlinMaterial{T}vSGIX parameter is not COLOR, SHININESS, or WEIGHT. INVALID_VALUE is generated if NonlinMaterial{T}vSGIX parameter is outside the range [0..MAX_NONLIN_TERMS). INVALID_ENUM is generated if GetNonlinLight{t}vSGIX parameter is not valid (LIGHT{0..MAX_NONLIN_LIGHTS-1}. INVALID_ENUM is generated if GetNonlinLight{t}vSGIX parameter is not COLOR. INVALID_ENUM is generated if GetNonlinMaterial{t}vSGIX parameter is not FRONT, BACK, or FRONT_AND_BACK. INVALID_ENUM is generated if GetNonlinMaterial{t}vSGIX parameter is not COLOR, SHININESS, or WEIGHT. New State Initial Get Value Get Command Type Value Attrib --------- ----------- ---- ------- ------ NONLINEAR_LIGHTING_SGIX IsEnabled B False lighting/enable COLOR_SGIX GetNonlinLightfvSGIX 1*xC () lighting COLOR_SGIX GetNonlinMaterialfvSGIX 1*xC () lighting WEIGHT_SGIX GetNonlinMaterialfvSGIX 1*xW (1.0,1.0,1.0) lighting SHININESS GetNonlinMaterialfvSGIX 1*xR 1.0 lighting (material color terms) GetNonlinMaterialfvSGIX Z+ 0 lighting (light color terms) GetNonlinLightfvSGIX Z+ 0 lighting (material weight terms) GetNonlinMaterialfvSGIX Z+ 0 lighting (material shininess terms) GetNonlinMaterialfvSGIX Z+ 0 lighting New Implementation Dependent State Minimum Get Value Get Command Type Value --------- ----------- ---- ------- MAX_NONLIN_LIGHTS_SGIX GetInteger Z+ 1 MAX_NONLIN_TERMS_SGIX GetIngeger Z+ 12