| 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 <cap> parameter of Enable, Disable, and IsEnabled, by | 
 |     the <pname> parameters of GetBooleanv, GetIntegerv, GetFloatv, and  | 
 |     GetDoublev: | 
 |  | 
 |     NONLIN_LIGHTING_SGIX                                 0x???? | 
 |  | 
 |     Accepted by the <pname> parameter of GetBooleanv, GetIntegerv, GetFloatv, | 
 |     and GetDoublev: | 
 |  | 
 |     MAX_NONLIN_TERMS_SGIX                                0x???? | 
 |     MAX_NONLIN_LIGHTS_SGIX                               0x????+1 | 
 |      | 
 |     Accepted by the <pname> parameter of NonlinMaterialv, NonlinLightv: | 
 |  | 
 |     COLOR_SGIX                                           0x???? | 
 |  | 
 |     Accepted by the <pname> parameter of NonlinMaterialv: | 
 |  | 
 |     WEIGHT_SGIX                                          0x???? | 
 |  | 
 |  | 
 | Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) | 
 |  | 
 |     Section 2.13.1 Lighting | 
 |  | 
 |     ... <paragraph 2> | 
 |     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. | 
 |  | 
 |     ...<paragraph 3 - Lighting Operation> | 
 |     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. | 
 |  | 
 |     ...<table 2.7> | 
 |     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 | 
 |  | 
 |     ...<Page 45> | 
 |     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<i=0,n-1>(sum<j=0,min(tnlm, tnll)-1>(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 | 
 |  | 
 |     ... <paragraph 1.5> | 
 |     ...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 ) ; | 
 |  | 
 |     ... <paragraph 2> | 
 |     ... 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... | 
 |  | 
 |     ... <table 2.8> | 
 |  | 
 |     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 | 
 |  | 
 |     ... <paragraph 1> | 
 |     ...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 | 
 |  | 
 |     ... <paragraph 1> | 
 |     ...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) | 
 |  | 
 |     ... <page 145, list  of functions> | 
 |  | 
 |     void GetNonlinLight{f}v( enum light, enum value, int *terms, T *data ) ; | 
 |     void GetNonlinMaterial{f}v( enum face, enum value, int *terms, T *data ) ; | 
 |  | 
 |     ... <page 145, new paragraph between GetMaterial and GetTexParameter> | 
 |  | 
 |     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. | 
 |  | 
 |     ... <table 6.3> | 
 |     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 <pname> is not | 
 |     COLOR or <light> is not valid (LIGHT{0..MAX_NONLIN_LIGHTS-1}. | 
 |  | 
 |     INVALID_VALUE is generated if NonlinLight{f}vSGIX parameter <terms> 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 <face> is | 
 |     not FRONT, BACK, or FRONT_AND_BACK. | 
 |  | 
 |     INVALID_ENUM is generated if NonlinMaterial{T}vSGIX parameter <pname> is | 
 |     not COLOR, SHININESS, or WEIGHT. | 
 |  | 
 |     INVALID_VALUE is generated if NonlinMaterial{T}vSGIX parameter <terms> is | 
 |     outside the range [0..MAX_NONLIN_TERMS). | 
 |  | 
 |     INVALID_ENUM is generated if GetNonlinLight{t}vSGIX parameter <light>   | 
 |     is not valid (LIGHT{0..MAX_NONLIN_LIGHTS-1}. | 
 |  | 
 |     INVALID_ENUM is generated if GetNonlinLight{t}vSGIX parameter <pname> | 
 |     is not COLOR. | 
 |  | 
 |     INVALID_ENUM is generated if GetNonlinMaterial{t}vSGIX parameter <face> | 
 |     is not FRONT, BACK, or FRONT_AND_BACK. | 
 |  | 
 |     INVALID_ENUM is generated if GetNonlinMaterial{t}vSGIX parameter <pname> | 
 |     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 |