| 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 |