|
@@ -159,12 +159,13 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"void main() {",
|
|
|
|
|
|
- "gl_FragColor = vec4( vec3( 1.0 ), opacity );",
|
|
|
+ "vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does
|
|
|
+ "vec4 diffuseColor = vec4( diffuse, opacity );",
|
|
|
|
|
|
"vec4 colDiffuse = texture2D( tDiffuse, vUv );",
|
|
|
"colDiffuse.rgb *= colDiffuse.rgb;",
|
|
|
|
|
|
- "gl_FragColor = gl_FragColor * colDiffuse;",
|
|
|
+ "diffuseColor = diffuseColor * colDiffuse;",
|
|
|
|
|
|
"vec3 normal = normalize( vNormal );",
|
|
|
"vec3 viewPosition = normalize( vViewPosition );",
|
|
@@ -190,12 +191,11 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
// point lights
|
|
|
|
|
|
- "vec3 specularTotal = vec3( 0.0 );",
|
|
|
+ "vec3 totalSpecularLight = vec3( 0.0 );",
|
|
|
+ "vec3 totalDiffuseLight = vec3( 0.0 );",
|
|
|
|
|
|
"#if MAX_POINT_LIGHTS > 0",
|
|
|
|
|
|
- "vec3 pointTotal = vec3( 0.0 );",
|
|
|
-
|
|
|
"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
|
|
|
|
|
|
"vec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );",
|
|
@@ -212,8 +212,8 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"float pointSpecularWeight = KS_Skin_Specular( normal, lVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
- "pointTotal += attenuation * diffuse * pointLightColor[ i ] * pointDiffuseWeight;",
|
|
|
- "specularTotal += attenuation * specular * pointLightColor[ i ] * pointSpecularWeight * specularStrength;",
|
|
|
+ "totalDiffuseLight += attenuation * pointLightColor[ i ] * pointDiffuseWeight;",
|
|
|
+ "totalSpecularLight += attenuation * specular * pointLightColor[ i ] * pointSpecularWeight * specularStrength;",
|
|
|
|
|
|
"}",
|
|
|
|
|
@@ -223,8 +223,6 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"#if MAX_DIR_LIGHTS > 0",
|
|
|
|
|
|
- "vec3 dirTotal = vec3( 0.0 );",
|
|
|
-
|
|
|
"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
|
|
|
|
|
|
"vec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );",
|
|
@@ -233,10 +231,10 @@ THREE.ShaderSkin = {
|
|
|
"float dirDiffuseWeightHalf = max( 0.5 * dot( normal, dirVector ) + 0.5, 0.0 );",
|
|
|
"vec3 dirDiffuseWeight = mix( vec3 ( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), uWrapRGB );",
|
|
|
|
|
|
- "float dirSpecularWeight = KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
+ "float dirSpecularWeight = KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
- "dirTotal += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;",
|
|
|
- "specularTotal += specular * directionalLightColor[ i ] * dirSpecularWeight * specularStrength;",
|
|
|
+ "totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;",
|
|
|
+ "totalSpecularLight += specular * directionalLightColor[ i ] * dirSpecularWeight * specularStrength;",
|
|
|
|
|
|
"}",
|
|
|
|
|
@@ -246,8 +244,6 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"#if MAX_HEMI_LIGHTS > 0",
|
|
|
|
|
|
- "vec3 hemiTotal = vec3( 0.0 );",
|
|
|
-
|
|
|
"for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {",
|
|
|
|
|
|
"vec3 lVector = transformDirection( hemisphereLightDirection[ i ], viewMatrix );",
|
|
@@ -255,7 +251,7 @@ THREE.ShaderSkin = {
|
|
|
"float dotProduct = dot( normal, lVector );",
|
|
|
"float hemiDiffuseWeight = 0.5 * dotProduct + 0.5;",
|
|
|
|
|
|
- "hemiTotal += diffuse * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
|
|
|
+ "totalDiffuseLight += mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight );",
|
|
|
|
|
|
// specular (sky light)
|
|
|
|
|
@@ -267,34 +263,21 @@ THREE.ShaderSkin = {
|
|
|
"vec3 lVectorGround = -lVector;",
|
|
|
"hemiSpecularWeight += KS_Skin_Specular( normal, lVectorGround, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
- "specularTotal += specular * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * specularStrength;",
|
|
|
+ "totalSpecularLight += specular * mix( hemisphereLightGroundColor[ i ], hemisphereLightSkyColor[ i ], hemiDiffuseWeight ) * hemiSpecularWeight * specularStrength;",
|
|
|
|
|
|
"}",
|
|
|
|
|
|
"#endif",
|
|
|
|
|
|
- // all lights contribution summation
|
|
|
-
|
|
|
- "vec3 totalLight = vec3( 0.0 );",
|
|
|
-
|
|
|
- "#if MAX_DIR_LIGHTS > 0",
|
|
|
- "totalLight += dirTotal;",
|
|
|
- "#endif",
|
|
|
-
|
|
|
- "#if MAX_POINT_LIGHTS > 0",
|
|
|
- "totalLight += pointTotal;",
|
|
|
- "#endif",
|
|
|
-
|
|
|
- "#if MAX_HEMI_LIGHTS > 0",
|
|
|
- "totalLight += hemiTotal;",
|
|
|
- "#endif",
|
|
|
-
|
|
|
- "gl_FragColor.xyz = gl_FragColor.xyz * ( totalLight + ambientLightColor * diffuse ) + specularTotal;",
|
|
|
+ "outgoingLight += diffuseColor.xyz * ( totalDiffuseLight + ambientLightColor * diffuse ) + totalSpecularLight;",
|
|
|
|
|
|
THREE.ShaderChunk[ "shadowmap_fragment" ],
|
|
|
THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
|
|
|
THREE.ShaderChunk[ "fog_fragment" ],
|
|
|
|
|
|
+ "gl_FragColor = vec4( outgoingLight, diffuseColor.a );", // TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects
|
|
|
+
|
|
|
+
|
|
|
"}"
|
|
|
|
|
|
].join("\n"),
|
|
@@ -468,9 +451,9 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"void main() {",
|
|
|
|
|
|
- "gl_FragColor = vec4( 1.0 );",
|
|
|
+ "vec3 outgoingLight = vec3( 0.0 );", // outgoing light does not have an alpha, the surface does
|
|
|
+ "vec4 diffuseColor = vec4( diffuse, opacity );",
|
|
|
|
|
|
- "vec4 mColor = vec4( diffuse, opacity );",
|
|
|
"vec4 mSpecular = vec4( specular, opacity );",
|
|
|
|
|
|
"vec3 normalTex = texture2D( tNormal, vUv ).xyz * 2.0 - 1.0;",
|
|
@@ -480,7 +463,7 @@ THREE.ShaderSkin = {
|
|
|
"vec4 colDiffuse = texture2D( tDiffuse, vUv );",
|
|
|
"colDiffuse *= colDiffuse;",
|
|
|
|
|
|
- "gl_FragColor = gl_FragColor * colDiffuse;",
|
|
|
+ "diffuseColor *= colDiffuse;",
|
|
|
|
|
|
"mat3 tsb = mat3( vTangent, vBinormal, vNormal );",
|
|
|
"vec3 finalNormal = tsb * normalTex;",
|
|
@@ -490,12 +473,11 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
// point lights
|
|
|
|
|
|
- "vec3 specularTotal = vec3( 0.0 );",
|
|
|
+ "vec3 totalDiffuseLight = vec3( 0.0 );",
|
|
|
+ "vec3 totalSpecularLight = vec3( 0.0 );",
|
|
|
|
|
|
"#if MAX_POINT_LIGHTS > 0",
|
|
|
|
|
|
- "vec4 pointTotal = vec4( vec3( 0.0 ), 1.0 );",
|
|
|
-
|
|
|
"for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {",
|
|
|
|
|
|
"vec3 pointVector = normalize( vPointLight[ i ].xyz );",
|
|
@@ -503,10 +485,10 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"float pointDiffuseWeight = max( dot( normal, pointVector ), 0.0 );",
|
|
|
|
|
|
- "pointTotal += pointDistance * vec4( pointLightColor[ i ], 1.0 ) * ( mColor * pointDiffuseWeight );",
|
|
|
+ "totalDiffuseLight += pointDistance * pointLightColor[ i ] * pointDiffuseWeight;",
|
|
|
|
|
|
"if ( passID == 1 )",
|
|
|
- "specularTotal += pointDistance * mSpecular.xyz * pointLightColor[ i ] * KS_Skin_Specular( normal, pointVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
+ "totalSpecularLight += pointDistance * mSpecular.xyz * pointLightColor[ i ] * KS_Skin_Specular( normal, pointVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
"}",
|
|
|
|
|
@@ -516,40 +498,27 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"#if MAX_DIR_LIGHTS > 0",
|
|
|
|
|
|
- "vec4 dirTotal = vec4( vec3( 0.0 ), 1.0 );",
|
|
|
-
|
|
|
"for( int i = 0; i < MAX_DIR_LIGHTS; i++ ) {",
|
|
|
|
|
|
"vec3 dirVector = transformDirection( directionalLightDirection[ i ], viewMatrix );",
|
|
|
|
|
|
"float dirDiffuseWeight = max( dot( normal, dirVector ), 0.0 );",
|
|
|
|
|
|
- "dirTotal += vec4( directionalLightColor[ i ], 1.0 ) * ( mColor * dirDiffuseWeight );",
|
|
|
+ "totalDiffuseLight += directionalLightColor[ i ] * dirDiffuseWeight;",
|
|
|
|
|
|
"if ( passID == 1 )",
|
|
|
- "specularTotal += mSpecular.xyz * directionalLightColor[ i ] * KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
+ "totalSpecularLight += mSpecular.xyz * directionalLightColor[ i ] * KS_Skin_Specular( normal, dirVector, viewPosition, uRoughness, uSpecularBrightness );",
|
|
|
|
|
|
"}",
|
|
|
|
|
|
"#endif",
|
|
|
|
|
|
- // all lights contribution summation
|
|
|
|
|
|
- "vec4 totalLight = vec4( vec3( 0.0 ), opacity );",
|
|
|
-
|
|
|
- "#if MAX_DIR_LIGHTS > 0",
|
|
|
- "totalLight += dirTotal;",
|
|
|
- "#endif",
|
|
|
-
|
|
|
- "#if MAX_POINT_LIGHTS > 0",
|
|
|
- "totalLight += pointTotal;",
|
|
|
- "#endif",
|
|
|
-
|
|
|
- "gl_FragColor = gl_FragColor * totalLight;",
|
|
|
+ "outgoingLight += diffuseColor.rgb * ( totalDiffuseLight + totalSpecularLight );",
|
|
|
|
|
|
"if ( passID == 0 ) {",
|
|
|
|
|
|
- "gl_FragColor = vec4( sqrt( gl_FragColor.xyz ), gl_FragColor.w );",
|
|
|
+ "outgoingLight = sqrt( outgoingLight );",
|
|
|
|
|
|
"} else if ( passID == 1 ) {",
|
|
|
|
|
@@ -557,11 +526,11 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
"#ifdef VERSION1",
|
|
|
|
|
|
- "vec3 nonblurColor = sqrt( gl_FragColor.xyz );",
|
|
|
+ "vec3 nonblurColor = sqrt(outgoingLight );",
|
|
|
|
|
|
"#else",
|
|
|
|
|
|
- "vec3 nonblurColor = gl_FragColor.xyz;",
|
|
|
+ "vec3 nonblurColor = outgoingLight;",
|
|
|
|
|
|
"#endif",
|
|
|
|
|
@@ -578,20 +547,19 @@ THREE.ShaderSkin = {
|
|
|
//"gl_FragColor = vec4( vec3( 0.25, 0.6, 0.8 ) * nonblurColor + vec3( 0.15, 0.25, 0.2 ) * blur1Color + vec3( 0.15, 0.15, 0.0 ) * blur2Color + vec3( 0.45, 0.0, 0.0 ) * blur3Color, gl_FragColor.w );",
|
|
|
|
|
|
|
|
|
- "gl_FragColor = vec4( vec3( 0.22, 0.437, 0.635 ) * nonblurColor + ",
|
|
|
+ "outgoingLight = vec3( vec3( 0.22, 0.437, 0.635 ) * nonblurColor + ",
|
|
|
"vec3( 0.101, 0.355, 0.365 ) * blur1Color + ",
|
|
|
"vec3( 0.119, 0.208, 0.0 ) * blur2Color + ",
|
|
|
"vec3( 0.114, 0.0, 0.0 ) * blur3Color + ",
|
|
|
- "vec3( 0.444, 0.0, 0.0 ) * blur4Color",
|
|
|
- ", gl_FragColor.w );",
|
|
|
+ "vec3( 0.444, 0.0, 0.0 ) * blur4Color );",
|
|
|
|
|
|
- "gl_FragColor.xyz *= pow( colDiffuse.xyz, vec3( 0.5 ) );",
|
|
|
+ "outgoingLight *= sqrt( colDiffuse.xyz );",
|
|
|
|
|
|
- "gl_FragColor.xyz += ambientLightColor * diffuse * colDiffuse.xyz + specularTotal;",
|
|
|
+ "outgoingLight += ambientLightColor * diffuse * colDiffuse.xyz + totalSpecularLight;",
|
|
|
|
|
|
"#ifndef VERSION1",
|
|
|
|
|
|
- "gl_FragColor.xyz = sqrt( gl_FragColor.xyz );",
|
|
|
+ "outgoingLight = sqrt( outgoingLight );",
|
|
|
|
|
|
"#endif",
|
|
|
|
|
@@ -599,6 +567,8 @@ THREE.ShaderSkin = {
|
|
|
|
|
|
THREE.ShaderChunk[ "fog_fragment" ],
|
|
|
|
|
|
+ "gl_FragColor = vec4( outgoingLight, diffuseColor.a );", // TODO, this should be pre-multiplied to allow for bright highlights on very transparent objects
|
|
|
+
|
|
|
"}"
|
|
|
|
|
|
].join("\n"),
|