|
@@ -105,11 +105,13 @@ THREE.ShaderSkin = {
|
|
|
"uniform vec3 pointLightColor[ MAX_POINT_LIGHTS ];",
|
|
|
"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
|
|
|
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
|
|
|
+ "uniform float pointLightDecayExponent[ MAX_POINT_LIGHTS ];",
|
|
|
|
|
|
"#endif",
|
|
|
|
|
|
"varying vec3 vViewPosition;",
|
|
|
|
|
|
+ THREE.ShaderChunk[ "common" ],
|
|
|
THREE.ShaderChunk[ "shadowmap_pars_fragment" ],
|
|
|
THREE.ShaderChunk[ "fog_pars_fragment" ],
|
|
|
THREE.ShaderChunk[ "bumpmap_pars_fragment" ],
|
|
@@ -201,11 +203,8 @@ THREE.ShaderSkin = {
|
|
|
"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
|
|
|
|
|
|
"vec3 lVector = lPosition.xyz + vViewPosition.xyz;",
|
|
|
-
|
|
|
- "float lDistance = 1.0;",
|
|
|
-
|
|
|
- "if ( pointLightDistance[ i ] > 0.0 )",
|
|
|
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
|
|
|
+
|
|
|
+ "float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecayExponent[i] );",
|
|
|
|
|
|
"lVector = normalize( lVector );",
|
|
|
|
|
@@ -215,8 +214,8 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"float pointSpecularWeight = KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
- "pointTotal += lDistance * diffuse * pointLightColor[ i ] * pointDiffuseWeight;",
|
|
|
- "specularTotal += lDistance * specular * pointLightColor[ i ] * pointSpecularWeight * specularStrength;",
|
|
|
+ "pointTotal += attenuation * diffuse * pointLightColor[ i ] * pointDiffuseWeight;",
|
|
|
+ "specularTotal += attenuation * specular * pointLightColor[ i ] * pointSpecularWeight * specularStrength;",
|
|
|
|
|
|
"}",
|
|
|
|
|
@@ -314,6 +313,7 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"varying vec3 vViewPosition;",
|
|
|
|
|
|
+ THREE.ShaderChunk[ "common" ],
|
|
|
THREE.ShaderChunk[ "shadowmap_pars_vertex" ],
|
|
|
|
|
|
"void main() {",
|
|
@@ -430,6 +430,7 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"varying vec3 vViewPosition;",
|
|
|
|
|
|
+ THREE.ShaderChunk[ "common" ],
|
|
|
THREE.ShaderChunk[ "fog_pars_fragment" ],
|
|
|
|
|
|
"float fresnelReflectance( vec3 H, vec3 V, float F0 ) {",
|
|
@@ -632,6 +633,7 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
|
|
|
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
|
|
|
+ "uniform float pointLightDecayExponent[ MAX_POINT_LIGHTS ];",
|
|
|
|
|
|
"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
|
|
|
|
|
@@ -639,6 +641,8 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"varying vec3 vViewPosition;",
|
|
|
|
|
|
+ THREE.ShaderChunk[ "common" ],
|
|
|
+
|
|
|
"void main() {",
|
|
|
|
|
|
"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
|
|
@@ -668,14 +672,11 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"vec3 lVector = lPosition.xyz - mvPosition.xyz;",
|
|
|
|
|
|
- "float lDistance = 1.0;",
|
|
|
-
|
|
|
- "if ( pointLightDistance[ i ] > 0.0 )",
|
|
|
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
|
|
|
+ "float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecayExponent[i] );",
|
|
|
|
|
|
"lVector = normalize( lVector );",
|
|
|
|
|
|
- "vPointLight[ i ] = vec4( lVector, lDistance );",
|
|
|
+ "vPointLight[ i ] = vec4( lVector, attenuation );",
|
|
|
|
|
|
"}",
|
|
|
|
|
@@ -721,6 +722,7 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"uniform vec3 pointLightPosition[ MAX_POINT_LIGHTS ];",
|
|
|
"uniform float pointLightDistance[ MAX_POINT_LIGHTS ];",
|
|
|
+ "uniform float pointLightDecayExponent[ MAX_POINT_LIGHTS ];",
|
|
|
|
|
|
"varying vec4 vPointLight[ MAX_POINT_LIGHTS ];",
|
|
|
|
|
@@ -728,6 +730,8 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"varying vec3 vViewPosition;",
|
|
|
|
|
|
+ THREE.ShaderChunk[ "common" ],
|
|
|
+
|
|
|
"void main() {",
|
|
|
|
|
|
"vec4 worldPosition = modelMatrix * vec4( position, 1.0 );",
|
|
@@ -757,14 +761,11 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"vec3 lVector = lPosition.xyz - mvPosition.xyz;",
|
|
|
|
|
|
- "float lDistance = 1.0;",
|
|
|
-
|
|
|
- "if ( pointLightDistance[ i ] > 0.0 )",
|
|
|
- "lDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );",
|
|
|
+ "float attenuation = calcLightAttenuation( length( lVector ), pointLightDistance[ i ], pointLightDecayExponent[i] );",
|
|
|
|
|
|
"lVector = normalize( lVector );",
|
|
|
|
|
|
- "vPointLight[ i ] = vec4( lVector, lDistance );",
|
|
|
+ "vPointLight[ i ] = vec4( lVector, attenuation );",
|
|
|
|
|
|
"}",
|
|
|
|