Changes

774 bytes added ,  06:54, 4 December 2015
Line 6,199: Line 6,199:  
== Fragment lighting registers ==
 
== Fragment lighting registers ==
   −
=== GPUREG_LIGHTING_ENABLE0 ===
+
=== GPUREG_LIGHT''i''_SPECULAR0 ===
   −
This register is set to 0 when fragment lighting is disabled, and to 1 when it is enabled.
+
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Blue
 +
|-
 +
| 10-17
 +
| unsigned, Green
 +
|-
 +
| 20-27
 +
| unsigned, Red
 +
|}
 +
 
 +
These registers contain the specular0 color of the corresponding light. Usually set to material_specular0*lightX_specular0.
 +
 
 +
=== GPUREG_LIGHT''i''_SPECULAR1 ===
 +
 
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Blue
 +
|-
 +
| 10-17
 +
| unsigned, Green
 +
|-
 +
| 20-27
 +
| unsigned, Red
 +
|}
 +
 
 +
These registers contain the specular1 color of the corresponding light. Usually set to material_specular1*lightX_specular1.
 +
 
 +
=== GPUREG_LIGHT''i''_DIFFUSE ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Blue
 +
|-
 +
| 10-17
 +
| unsigned, Green
 +
|-
 +
| 20-27
 +
| unsigned, Red
 +
|}
 +
 
 +
These registers contain the diffuse color of the corresponding light. Usually set to material_diffuse*lightX_diffuse.
 +
 
 +
=== GPUREG_LIGHT''i''_AMBIENT ===
   −
=== GPUREG_LIGHTING_ENABLE1 ===
+
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Blue
 +
|-
 +
| 10-17
 +
| unsigned, Green
 +
|-
 +
| 20-27
 +
| unsigned, Red
 +
|}
 +
 
 +
These registers contain the ambient color of the corresponding light. Usually set to material_ambient*lightX_ambient.
 +
 
 +
=== GPUREG_LIGHT''i''_XY ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-15
 +
| float1.5.10, X coordinate
 +
|-
 +
| 16-31
 +
| float1.5.10, Y coordinate
 +
|}
 +
 
 +
These registers (along with _Z) represent the light position (for a positional light) or the light direction vector (for a directional light) of the corresponding light.
 +
 
 +
=== GPUREG_LIGHT''i''_Z ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-15
 +
| float1.5.10, Z coordinate
 +
|}
 +
 
 +
These registers (along with _XY) represent the light position (for a positional light) or the light direction vector (for a directional light) of the corresponding light.
 +
 
 +
=== GPUREG_LIGHT''i''_SPOTDIR_XY ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-12
 +
| fixed1.1.11, X coordinate (Usually the input value is negated)
 +
|-
 +
| 16-28
 +
| fixed1.1.11, Y coordinate (Usually the input value is negated)
 +
|}
 +
 
 +
These registers (along with _Z) represent the spot direction (unitary) vector of the corresponding light.
 +
 
 +
=== GPUREG_LIGHT''i''_SPOTDIR_Z ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-12
 +
| fixed1.1.11, Z coordinate (Usually the input value is negated)
 +
|}
   −
This register is set to 1 when fragment lighting is disabled, and to 0 when it is enabled.
+
These registers (along with _XY) represent the spot direction (unitary) vector of the corresponding light.
   −
=== GPUREG_LIGHTING_CONFIG0 ===
+
=== GPUREG_LIGHT''i''_CONFIG ===
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,214: Line 6,333:  
|-
 
|-
 
| 0
 
| 0
| unsigned, Shadow factor enable, usually set to bit16 OR bit18 OR bit19
+
| unsigned, Light type (0 = positional light, 1 = directional light)
 
|-
 
|-
 
| 1
 
| 1
| Unknown, set to 0
+
| unsigned, Two side diffuse (0 = one side, 1 = both sides)
 +
|-
 +
| 2
 +
| unsigned, Use geometric factor 0 (0 = don't use, 1 = use)
 +
|-
 +
| 3
 +
| unsigned, Use geometric factor 1 (0 = don't use, 1 = use)
 +
|}
 +
 
 +
=== GPUREG_LIGHT''i''_ATTENUATION_BIAS ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-19
 +
| float1.7.12, Distance attenuation bias
 +
|}
 +
 
 +
These registers contain the distance attenuation bias value of the corresponding light. The attenuation factor is lut_DA(clip(bias + scale*distance, 0.0, 1.0)).
 +
 
 +
=== GPUREG_LIGHT''i''_ATTENUATION_SCALE ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-19
 +
| float1.7.12, Distance attenuation scale
 +
|}
 +
 
 +
These registers contain the distance attenuation scale value of the corresponding light. The attenuation factor is lut_DA(clip(bias + scale*distance, 0.0, 1.0)).
 +
 
 +
=== GPUREG_LIGHTING_AMBIENT ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Blue
 +
|-
 +
| 10-17
 +
| unsigned, Green
 +
|-
 +
| 20-27
 +
| unsigned, Red
 +
|}
 +
 
 +
This register contains the initial value of the fragment primary color before the partial colors that correspond to each enabled light are added. Usually set to material_emission + material_ambient*scene_ambient.
 +
 
 +
=== GPUREG_LIGHTING_NUM_LIGHTS ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-2
 +
| unsigned, Number of active lights - 1
 +
|}
 +
 
 +
=== GPUREG_LIGHTING_CONFIG0 ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0
 +
| unsigned, Shadow factor enabled (0 = disabled, 1 = enabled) (usually accompanied by bit 16, 17, or 18)
 
|-
 
|-
 
| 2-3
 
| 2-3
| unsigned, "Fresnel selector" (see below)
+
| unsigned, Fresnel selector
 
|-
 
|-
 
| 4-7
 
| 4-7
| unsigned, "Config", "Light env config" (see below)
+
| unsigned, Light environment configuration
 
|-
 
|-
| 8-15
+
| 8-11
| Unknown, set to 4
+
| 0x4
 
|-
 
|-
 
| 16
 
| 16
| unsigned, "Shadow primary", 0=disabled, 1=enabled
+
| unsigned, Apply shadow attenuation to primary color (0 = don't apply, 1 = apply)
 
|-
 
|-
 
| 17
 
| 17
| unsigned, "Shadow secondary", 0=disabled, 1=enabled
+
| unsigned, Apply shadow attenuation to secondary color (0 = don't apply, 1 = apply)
 
|-
 
|-
 
| 18
 
| 18
| unsigned, "Invert shadow", 0=disabled, 1=enabled
+
| unsigned, Invert shadow attenuation (0 = don't invert, 1 = invert)
 
|-
 
|-
 
| 19
 
| 19
| unsigned, "Shadow alpha", 0=disabled, 1=enabled
+
| unsigned, Apply shadow attenuation to alpha component (0 = don't apply, 1 = apply)
|-
  −
| 20-21
  −
| Unknown, set to 0
   
|-
 
|-
 
| 22-23
 
| 22-23
| unsigned, "Bump selector", texture unit for bumpmapping
+
| unsigned, Bump map texture unit
 
|-
 
|-
 
| 24-25
 
| 24-25
| unsigned, "Shadow selector", texture unit for shadow mapping
+
| unsigned, Shadow map texture unit
|-
  −
| 26
  −
| Unknown, set to 0
   
|-
 
|-
 
| 27
 
| 27
| unsigned, "Clamp highlights", 0=disabled, 1=enabled
+
| unsigned, Clamp highlights (0 = disabled, 1 = enabled)
 
|-
 
|-
 
| 28-29
 
| 28-29
| unsigned, "Bump mode", "Light env texy usage" (see below)
+
| unsigned, Bump mode
 
|-
 
|-
 
| 30
 
| 30
| unsigned, "Bump renorm", 0=enabled, 1=disabled
+
| unsigned, Recalculate bump vectors (0 = enabled, 1 = disabled) (usually set to 1 when bump mode is not 0)
 
|-
 
|-
 
| 31
 
| 31
| Unknown, set to 1
+
| 0x1
 
|}
 
|}
   −
Fresnel selector constants:
+
Fresnel selector values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,272: Line 6,453:  
|-
 
|-
 
| 0
 
| 0
| NO_FRESNEL
+
| None
 
|-
 
|-
 
| 1
 
| 1
| PRI_ALPHA_FRESNEL
+
| Primary alpha
 
|-
 
|-
 
| 2
 
| 2
| SEC_ALPHA_FRESNEL
+
| Secondary alpha
 
|-
 
|-
 
| 3
 
| 3
| PRI_SEC_ALPHA_FRESNEL
+
| Primary and secondary alpha
 
|}
 
|}
   −
The light environment configuration controls which LUTs are available for use. If a LUT is not available in the selected configuration, its value will always read a constant 1.0 regardless of the enable state in GPUREG_LIGHTING_CONFIG1. If lut_RR is enabled but not lut_RG or lut_RB, the output of lut_RR is used for the three components; Red, Green and Blue.
+
The light environment configuration controls which LUTs are available for use. If a LUT is not available in the selected configuration, its value will always read a constant 1.0 regardless of the enable state in GPUREG_LIGHTING_CONFIG1. If RR is enabled but not RG or RB, the output of RR is used for the three components; Red, Green and Blue.
   −
Light env config constants:
+
Light environment configuration values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,294: Line 6,475:  
|-
 
|-
 
| 0
 
| 0
| LIGHT_ENV_LAYER_CONFIG0
+
| Configuration 0
| lut_D0, lut_RR, lut_SP, lut_DA
+
| D0, RR, SP, DA
 
|-
 
|-
 
| 1
 
| 1
| LIGHT_ENV_LAYER_CONFIG1
+
| Configuration 1
| lut_FR, lut_RR, lut_SP, lut_DA
+
| FR, RR, SP, DA
 
|-
 
|-
 
| 2
 
| 2
| LIGHT_ENV_LAYER_CONFIG2
+
| Configuration 2
| lut_D0, lut_D1, lut_RR, lut_DA
+
| D0, D1, RR, DA
 
|-
 
|-
 
| 3
 
| 3
| LIGHT_ENV_LAYER_CONFIG3
+
| Configuration 3
| lut_D0, lut_D1, lut_FR, lut_DA
+
| D0, D1, FR, DA
 
|-
 
|-
 
| 4
 
| 4
| LIGHT_ENV_LAYER_CONFIG4
+
| Configuration 4
| All except for lut_FR
+
| All except for FR
 
|-
 
|-
 
| 5
 
| 5
| LIGHT_ENV_LAYER_CONFIG5
+
| Configuration 5
| All except for lut_D1
+
| All except for D1
 
|-
 
|-
 
| 6
 
| 6
| LIGHT_ENV_LAYER_CONFIG6
+
| Configuration 6
| All except for lut_RB and lut_RG
+
| All except for RB and RG
 
|-
 
|-
| 8 (sic)
+
| 8
| LIGHT_ENV_LAYER_CONFIG7
+
| Configuration 7
 
| All
 
| All
 
|}
 
|}
   −
Bump mode constants:
+
Bump mode values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,333: Line 6,514:  
|-
 
|-
 
| 0
 
| 0
| BUMP_NOT_USED
+
| Not used
 
|-
 
|-
 
| 1
 
| 1
| BUMP_AS_BUMP
+
| Use as bump map
 
|-
 
|-
 
| 2
 
| 2
| BUMP_AS_TANG
+
| Use as tangent map
 
|}
 
|}
  −
Bit 30 is set when bump mode is not zero.
      
=== GPUREG_LIGHTING_CONFIG1 ===
 
=== GPUREG_LIGHTING_CONFIG1 ===
Line 6,351: Line 6,530:  
|-
 
|-
 
| 0
 
| 0
| unsigned, Disable bit for frag light source 0 shadows
+
| unsigned, Fragment light source 0 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 1
 
| 1
| unsigned, Disable bit for frag light source 1 shadows
+
| unsigned, Fragment light source 1 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 2
 
| 2
| unsigned, Disable bit for frag light source 2 shadows
+
| unsigned, Fragment light source 2 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 3
 
| 3
| unsigned, Disable bit for frag light source 3 shadows
+
| unsigned, Fragment light source 3 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 4
 
| 4
| unsigned, Disable bit for frag light source 4 shadows
+
| unsigned, Fragment light source 4 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 5
 
| 5
| unsigned, Disable bit for frag light source 5 shadows
+
| unsigned, Fragment light source 5 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 6
 
| 6
| unsigned, Disable bit for frag light source 6 shadows
+
| unsigned, Fragment light source 6 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 7
 
| 7
| unsigned, Disable bit for frag light source 7 shadows
+
| unsigned, Fragment light source 7 shadows disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 8
 
| 8
| unsigned, Disable bit for frag light source 0 spot
+
| unsigned, Fragment light source 0 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 9
 
| 9
| unsigned, Disable bit for frag light source 1 spot
+
| unsigned, Fragment light source 1 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 10
 
| 10
| unsigned, Disable bit for frag light source 2 spot
+
| unsigned, Fragment light source 2 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 11
 
| 11
| unsigned, Disable bit for frag light source 3 spot
+
| unsigned, Fragment light source 3 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 12
 
| 12
| unsigned, Disable bit for frag light source 4 spot
+
| unsigned, Fragment light source 4 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 13
 
| 13
| unsigned, Disable bit for frag light source 5 spot
+
| unsigned, Fragment light source 5 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 14
 
| 14
| unsigned, Disable bit for frag light source 6 spot
+
| unsigned, Fragment light source 6 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 15
 
| 15
| unsigned, Disable bit for frag light source 7 spot
+
| unsigned, Fragment light source 7 spot light disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 16
 
| 16
| unsigned, Disable bit for lut_D0
+
| unsigned, Term 0 distribution component D0 LUT disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 17
 
| 17
| unsigned, Disable bit for lut_D1
+
| unsigned, Term 1 distribution component D1 LUT disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 18
 
| 18
| Unknown, set to 1
+
| 0x1
 
|-
 
|-
 
| 19
 
| 19
| unsigned, Disable bit for lut_FR
+
| unsigned, Fresnel FR LUT disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
| 20
+
| 20-22
| unsigned, Disable bit for lut_RB
+
| unsigned, Term 1 reflection component RB LUT disabled (0 = enabled, 7 = disabled)
 
|-
 
|-
 
| 21
 
| 21
| unsigned, Disable bit for lut_RG
+
| unsigned, Term 1 reflection component RG LUT disabled (0 = enabled, 7 = disabled)
 
|-
 
|-
 
| 22
 
| 22
| unsigned, Disable bit for lut_RR
+
| unsigned, Term 1 reflection component RR LUT disabled (0 = enabled, 7 = disabled)
|-
  −
| 23
  −
| Unknown, set to 1
   
|-
 
|-
 
| 24
 
| 24
| unsigned, Disable bit for frag light source 0 distance attenuation
+
| unsigned, Fragment light source 0 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 25
 
| 25
| unsigned, Disable bit for frag light source 1 distance attenuation
+
| unsigned, Fragment light source 1 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 26
 
| 26
| unsigned, Disable bit for frag light source 2 distance attenuation
+
| unsigned, Fragment light source 2 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 27
 
| 27
| unsigned, Disable bit for frag light source 3 distance attenuation
+
| unsigned, Fragment light source 3 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 28
 
| 28
| unsigned, Disable bit for frag light source 4 distance attenuation
+
| unsigned, Fragment light source 4 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 29
 
| 29
| unsigned, Disable bit for frag light source 5 distance attenuation
+
| unsigned, Fragment light source 5 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 30
 
| 30
| unsigned, Disable bit for frag light source 6 distance attenuation
+
| unsigned, Fragment light source 6 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 31
 
| 31
| unsigned, Disable bit for frag light source 7 distance attenuation
+
| unsigned, Fragment light source 7 distance attenuation disabled (0 = enabled, 1 = disabled)
 
|}
 
|}
   −
=== GPUREG_LIGHTING_NUM_LIGHTS ===
+
=== GPUREG_LIGHTING_LUT_INDEX ===
 +
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 +
|-
 +
| 0-7
 +
| unsigned, Starting index
 +
|-
 +
| 8-12
 +
| unsigned, Look-up table
 +
|}
   −
The number of active lights minus one (0..7) is written to this register.
+
This register controls which LUT and what offset into it the LUT_DATA register writes to.
   −
=== GPUREG_LIGHTING_LIGHT_PERMUTATION ===
+
Lookup table values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
! Bits
+
! Value
 
! Description
 
! Description
 
|-
 
|-
| 0-2
+
| 0
| unsigned, ID of the 1st enabled light (0..7)
+
| D0
 
|-
 
|-
| 4-6
+
| 1
| unsigned, ID of the 2nd enabled light (0..7)
+
| D1
 
|-
 
|-
| 8-10
+
| 3
| unsigned, ID of the 3rd enabled light (0..7)
+
| FR
 
|-
 
|-
| 12-14
+
| 4
| unsigned, ID of the 4th enabled light (0..7)
+
| RB
 
|-
 
|-
| 16-18
+
| 5
| unsigned, ID of the 5th enabled light (0..7)
+
| RG
 
|-
 
|-
| 20-22
+
| 6
| unsigned, ID of the 6th enabled light (0..7)
+
| RR
 
|-
 
|-
| 24-26
+
| 8-15
| unsigned, ID of the 7th enabled light (0..7)
+
| SP0-7
 
|-
 
|-
| 28-30
+
| 16-23
| unsigned, ID of the 8th enabled light (0..7)
+
| DA0-7
 
|}
 
|}
   −
=== GPUREG_LIGHTING_LUTINPUT_SELECT ===
+
=== GPUREG_LIGHTING_ENABLE1 ===
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,488: Line 6,675:  
! Description
 
! Description
 
|-
 
|-
| 0-3
+
| 0
| unsigned, Input selector for lut_D0
+
| unsigned, Disabled (0 = enabled, 1 = disabled)
|-
+
|}
| 4-7
+
 
| unsigned, Input selector for lut_D1
+
This register is set to 1 when fragment lighting is disabled, and to 0 when it is enabled.
|-
+
 
| 8-11
+
=== GPUREG_LIGHTING_LUT_DATA''i'' ===
| unsigned, Input selector for lut_SP
+
 
 +
{| class="wikitable" border="1"
 +
! Bits
 +
! Description
 
|-
 
|-
| 12-15
+
| 0-23
| unsigned, Input selector for lut_FR
+
| LUT data
|-
  −
| 16-19
  −
| unsigned, Input selector for lut_RB
  −
|-
  −
| 20-23
  −
| unsigned, Input selector for lut_RG
  −
|-
  −
| 24-27
  −
| unsigned, Input selector for lut_RR
   
|}
 
|}
   −
Input selector values:
+
Lighting LUT data is written here.
 +
 
 +
A LUT contains data for the input domain [-1.0, 1.0], which is indexed using a signed 8-bit number [-128, 127]. Therefore a LUT contains 256 entries. The index of a value is (int)(x/127.0f) & 0xFF.
 +
 
 +
DA: The input domain is [0.0, 1.0], and the index is an unsigned 8-bit number [0, 255] instead.
 +
 
 +
Format of an entry:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
! Value
+
! Bits
 
! Description
 
! Description
 
|-
 
|-
| 0
+
| 0-11
| N·H
+
| fixed0.0.12, Entry value
 
|-
 
|-
| 1
+
| 12-23
| V·H
+
| fixed1.0.11, Absolute value of the difference between the next entry and this entry, used to implement linear interpolation
|-
  −
| 2
  −
| N·V
  −
|-
  −
| 3
  −
| L·N
  −
|-
  −
| 4
  −
| -L·P (aka Spotlight aka SP)
  −
|-
  −
| 5
  −
| cos φ (aka CP)
   
|}
 
|}
   Line 6,542: Line 6,717:  
|-
 
|-
 
| 1
 
| 1
| unsigned, abs() flag for the input of lut_D0 (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of D0 (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 5
 
| 5
| unsigned, abs() flag for the input of lut_D1 (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of D1 (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 9
 
| 9
| unsigned, abs() flag for the input of lut_SP (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of SP (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 13
 
| 13
| unsigned, abs() flag for the input of lut_FR (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of FR (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 17
 
| 17
| unsigned, abs() flag for the input of lut_RB (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of RB (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 21
 
| 21
| unsigned, abs() flag for the input of lut_RG (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of RG (0 = enabled, 1 = disabled)
 
|-
 
|-
 
| 25
 
| 25
| unsigned, abs() flag for the input of lut_RR (0=enabled, 1=disabled)
+
| unsigned, abs() flag for the input of RR (0 = enabled, 1 = disabled)
 
|}
 
|}
    
This register controls whether the absolute value of the input is taken before using a LUT.
 
This register controls whether the absolute value of the input is taken before using a LUT.
   −
=== GPUREG_LIGHTING_LUTINPUT_SCALE ===
+
=== GPUREG_LIGHTING_LUTINPUT_SELECT ===
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,571: Line 6,746:  
! Description
 
! Description
 
|-
 
|-
| 0-3
+
| 0-2
| unsigned, Scaler selector for lut_D0
+
| unsigned, Input selector for D0
 
|-
 
|-
| 4-7
+
| 4-6
| unsigned, Scaler selector for lut_D1
+
| unsigned, Input selector for D1
 
|-
 
|-
| 8-11
+
| 8-10
| unsigned, Scaler selector for lut_SP
+
| unsigned, Input selector for SP
 
|-
 
|-
| 12-15
+
| 12-14
| unsigned, Scaler selector for lut_FR
+
| unsigned, Input selector for FR
 
|-
 
|-
| 16-19
+
| 16-18
| unsigned, Scaler selector for lut_RB
+
| unsigned, Input selector for RB
 
|-
 
|-
| 20-23
+
| 20-22
| unsigned, Scaler selector for lut_RG
+
| unsigned, Input selector for RG
 
|-
 
|-
| 24-27
+
| 24-26
| unsigned, Scaler selector for lut_RR
+
| unsigned, Input selector for RR
 
|}
 
|}
   −
Scaler selector values:
+
Input selector values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,600: Line 6,775:  
|-
 
|-
 
| 0
 
| 0
| 1x
+
| N·H
 
|-
 
|-
 
| 1
 
| 1
| 2x
+
| V·H
 
|-
 
|-
 
| 2
 
| 2
| 4x
+
| N·V
 
|-
 
|-
 
| 3
 
| 3
| 8x
+
| L·N
 
|-
 
|-
| 6
+
| 4
| 0.25x
+
| -L·P (aka Spotlight aka SP)
 
|-
 
|-
| 7
+
| 5
| 0.5x
+
| cos φ (aka CP)
 
|}
 
|}
   −
This register controls the scaling that is applied to the output of a LUT.
+
=== GPUREG_LIGHTING_LUTINPUT_SCALE ===
 
  −
=== GPUREG_LIGHTING_LUT_INDEX ===
  −
 
  −
This register controls which LUT and what offset into it the LUT_DATA register writes to.
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,628: Line 6,799:  
! Description
 
! Description
 
|-
 
|-
| 0-7
+
| 0-2
| unsigned, Starting entry offset (0...255)
+
| unsigned, Scaler selector for D0
 +
|-
 +
| 4-6
 +
| unsigned, Scaler selector for D1
 
|-
 
|-
 
| 8-10
 
| 8-10
| unsigned, LUT ID (context=0) or Light ID (context=1,2)
+
| unsigned, Scaler selector for SP
 
|-
 
|-
| 11-12
+
| 12-14
| unsigned, Context ID
+
| unsigned, Scaler selector for FR
|}
  −
 
  −
LUT ID values:
  −
 
  −
{| class="wikitable" border="1"
  −
! Value
  −
! Description
   
|-
 
|-
| 0
+
| 16-18
| lut_D0
+
| unsigned, Scaler selector for RB
 
|-
 
|-
| 1
+
| 20-22
| lut_D1
+
| unsigned, Scaler selector for RG
 
|-
 
|-
| 3
+
| 24-26
| lut_FR
+
| unsigned, Scaler selector for RR
|-
  −
| 4
  −
| lut_RB
  −
|-
  −
| 5
  −
| lut_RG
  −
|-
  −
| 6
  −
| lut_RR
   
|}
 
|}
   −
Context ID values:
+
This register controls the scaling that is applied to the output of a LUT.
 +
 
 +
Scaler selector values:
    
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,670: Line 6,830:  
|-
 
|-
 
| 0
 
| 0
| unsigned, LUTs common to all lights - writes to the LUT selected by the ID
+
| 1x
 
|-
 
|-
 
| 1
 
| 1
| unsigned, lut_SP - writes to the LUT specific to the selected light
+
| 2x
 
|-
 
|-
 
| 2
 
| 2
| unsigned, lut_DA - writes to the LUT specific to the selected light
+
| 4x
|}
  −
 
  −
=== GPUREG_LIGHTING_LUT_DATA ===
  −
 
  −
Lighting LUT data is written here.
  −
 
  −
A LUT contains data for the input domain [-1.0, 1.0], which is indexed using a signed 8-bit number [-128, 127]. Therefore a LUT contains 256 entries. The index of a value is (int)(x/127.0f) & 0xFF.
  −
 
  −
lut_DA: The input domain is [0.0, 1.0], and the index is an unsigned 8-bit number [0, 255] instead.
  −
 
  −
Format of an entry:
  −
 
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
   
|-
 
|-
| 0-11
+
| 3
| fixed0.0.12, Entry value (12bit fractional number; floatval = x / 4096; however 0xFFF is treated as 1.0)
+
| 8x
 
|-
 
|-
| 12-23
+
| 6
| fixed1.0.11, Absolute value of the difference between the next entry and this entry, used to implement linear interpolation
+
| 0.25x
|}
  −
 
  −
=== GPUREG_LIGHTING_AMBIENT ===
  −
 
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
   
|-
 
|-
| 0-7
+
| 7
| unsigned, Blue component (0..255)
+
| 0.5x
|-
  −
| 10-17
  −
| unsigned, Green component (0..255)
  −
|-
  −
| 20-27
  −
| unsigned, Red component (0..255)
   
|}
 
|}
   −
This register contains the initial value of the fragment primary color before the partial colors that correspond to each enabled light are added. Usually set to material_emission + material_ambient*scene_ambient.
+
=== GPUREG_LIGHTING_LIGHT_PERMUTATION ===
 
  −
=== GPUREG_LIGHTx_CONFIG ===
      
{| class="wikitable" border="1"
 
{| class="wikitable" border="1"
Line 6,724: Line 6,854:  
! Description
 
! Description
 
|-
 
|-
| 0
+
| 0-2
| unsigned, Light type (0 = positional light, 1 = directional light)
+
| unsigned, ID of the 1st enabled light
 
|-
 
|-
| 1
+
| 4-6
| unsigned, Two side diffuse (0=disable, 1=enable)
+
| unsigned, ID of the 2nd enabled light
 
|-
 
|-
| 2
+
| 8-10
| unsigned, Geometric factor 0 (0=disable, 1=enable)
+
| unsigned, ID of the 3rd enabled light
 
|-
 
|-
| 3
+
| 12-14
| unsigned, Geometric factor 1 (0=disable, 1=enable)
+
| unsigned, ID of the 4th enabled light
|}
  −
 
  −
=== GPUREG_LIGHTx_XY ===
  −
 
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
   
|-
 
|-
| 0-15
+
| 16-18
| float1.5.10, X coordinate
+
| unsigned, ID of the 5th enabled light
 
|-
 
|-
| 16-31
+
| 20-22
| float1.5.10, Y coordinate
+
| unsigned, ID of the 6th enabled light
|}
  −
 
  −
These registers (along with _Z) represent the light position (for a positional light) or the light direction vector (for a directional light) of the corresponding light.
  −
 
  −
=== GPUREG_LIGHTx_Z ===
  −
 
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
   
|-
 
|-
| 0-15
+
| 24-26
| float1.5.10, Z coordinate
+
| unsigned, ID of the 7th enabled light
|}
  −
 
  −
These registers (along with _XY) represent the light position (for a positional light) or the light direction vector (for a directional light) of the corresponding light.
  −
 
  −
=== GPUREG_LIGHTx_SPOTDIR_XY ===
  −
 
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
   
|-
 
|-
| 0-12
+
| 28-30
| fixed1.1.11, X coordinate (Usually the input value is negated)
+
| unsigned, ID of the 8th enabled light
|-
  −
| 16-28
  −
| fixed1.1.11, Y coordinate (Usually the input value is negated)
   
|}
 
|}
  −
These registers (along with _Z) represent the spot direction (unitary) vector of the corresponding light.
  −
  −
=== GPUREG_LIGHTx_SPOTDIR_Z ===
  −
  −
{| class="wikitable" border="1"
  −
! Bits
  −
! Description
  −
|-
  −
| 0-12
  −
| fixed1.1.11, Z coordinate (Usually the input value is negated)
  −
|}
  −
  −
These registers (along with _XY) represent the spot direction (unitary) vector of the corresponding light.
  −
  −
=== GPUREG_LIGHTx_ATTENUATION_BIAS ===
  −
  −
These registers contain the distance attenuation bias value (float20 = 1.7.12) of the corresponding light. The attenuation factor is lut_DA(clip(bias + scale*distance, 0.0, 1.0)).
  −
  −
=== GPUREG_LIGHTx_ATTENUATION_SCALE ===
  −
  −
These registers contain the distance attenuation scale value (float20 = 1.7.12) of the corresponding light. The attenuation factor is lut_DA(clip(bias + scale*distance, 0.0, 1.0)).
  −
  −
=== GPUREG_LIGHTx_AMBIENT ===
  −
  −
These registers contain the ambient color (same format as GPUREG_LIGHTING_AMBIENT) of the corresponding light. Usually set to material_ambient*lightX_ambient.
  −
  −
=== GPUREG_LIGHTx_DIFFUSE ===
  −
  −
These registers contain the diffuse color (same format as GPUREG_LIGHTING_AMBIENT) of the corresponding light. Usually set to material_diffuse*lightX_diffuse.
  −
  −
=== GPUREG_LIGHTx_SPECULAR0 ===
  −
  −
These registers contain the specular0 color (same format as GPUREG_LIGHTING_AMBIENT) of the corresponding light. Usually set to material_specular0*lightX_specular0.
  −
  −
=== GPUREG_LIGHTx_SPECULAR1 ===
  −
  −
These registers contain the specular1 color (same format as GPUREG_LIGHTING_AMBIENT) of the corresponding light. Usually set to material_specular1*lightX_specular1.
      
== Geometry pipeline registers ==
 
== Geometry pipeline registers ==
1,434

edits