提交 ce22ecc9 编写于 作者: B Ben Houston

perfect backwards compatibility for envmap_fragment for phong.

上级 89b3dac2
......@@ -47,15 +47,15 @@
#ifdef ENVMAP_BLENDING_MULTIPLY
indirectReflectedLight.specular = mix( indirectReflectedLight.specular, indirectReflectedLight.specular * envColor.xyz, specularStrength * reflectivity );
outgoingLight = mix( outgoingLight, outgoingLight * envColor.xyz, specularStrength * reflectivity );
#elif defined( ENVMAP_BLENDING_MIX )
indirectReflectedLight.specular = mix( indirectReflectedLight.specular, envColor.xyz, specularStrength * reflectivity );
outgoingLight = mix( outgoingLight, envColor.xyz, specularStrength * reflectivity );
#elif defined( ENVMAP_BLENDING_ADD )
indirectReflectedLight.specular += envColor.xyz * specularStrength * reflectivity;
outgoingLight += envColor.xyz * specularStrength * reflectivity;
#endif
......
......@@ -3,22 +3,19 @@ vec3 diffuse = vec3( 1.0 );
GeometricContext geometry = GeometricContext( mvPosition.xyz, normalize( transformedNormal ), normalize( -mvPosition.xyz ) );
GeometricContext backGeometry = GeometricContext( geometry.position, -geometry.normal, geometry.viewDir );
ReflectedLight frontReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
#if MAX_POINT_LIGHTS > 0
for ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {
IncidentLight directLight = getPointDirectLight( pointLights[ i ], geometry );
float dotNL = dot( geometry.normal, directLight.direction );
frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
#ifdef DOUBLE_SIDED
float dotNLBack = dot( -geometry.normal, directLight.direction );
backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
#endif
......@@ -32,13 +29,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
IncidentLight directLight = getSpotDirectLight( spotLights[ i ], geometry );
float dotNL = dot( geometry.normal, directLight.direction );
frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
#ifdef DOUBLE_SIDED
float dotNLBack = dot( -geometry.normal, directLight.direction );
backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
#endif
}
......@@ -51,13 +48,13 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
IncidentLight directLight = getDirectionalDirectLight( directionalLights[ i ], geometry );
float dotNL = dot( geometry.normal, directLight.direction );
frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
float dotNL = saturate( dot( geometry.normal, directLight.direction ) );
vLightFront += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
#ifdef DOUBLE_SIDED
float dotNLBack = dot( -geometry.normal, directLight.direction );
backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
float backDotNL = saturate( dot( -geometry.normal, directLight.direction ) );
vLightBack += backDotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
#endif
......@@ -65,32 +62,45 @@ ReflectedLight backReflectedLight = ReflectedLight( vec3( 0.0 ), vec3( 0.0 ) );
#endif
#if MAX_HEMI_LIGHTS > 0
{
IncidentLight frontIndirectLight;
frontIndirectLight.direction = geometry.normal;
frontIndirectLight.color = ambientLightColor;
for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
#ifdef DOUBLE_SIDED
IncidentLight backIndirectLight;
backIndirectLight.direction = -geometry.normal;
backIndirectLight.color = ambientLightColor;
IncidentLight indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], geometry );
#endif
float dotNL = dot( geometry.normal, directLight.direction );
frontReflectedLight.diffuse += dotNL * directLight.color * BRDF_Diffuse_Lambert( directLight, geometry, diffuse );
#if MAX_HEMI_LIGHTS > 0
#ifdef DOUBLE_SIDED
indirectLight = getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry );
for ( int i = 0; i < MAX_HEMI_LIGHTS; i ++ ) {
float dotNLBack = dot( -geometry.normal, directLight.direction );
backReflectedLight.diffuse += dotNLBack * directLight.color * BRDF_Diffuse_Lambert( directLight, backGeometry, diffuse );
frontIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], geometry ).color;
#endif
}
#ifdef DOUBLE_SIDED
backIndirectLight.color += getHemisphereIndirectLight( hemisphereLights[ i ], backGeometry ).color;
#endif
#endif
}
vLightFront = frontReflectedLight.diffuse;
#endif
#ifdef DOUBLE_SIDED
float frontDotNL = saturate( dot( geometry.normal, frontIndirectLight.direction ) );
vLightFront += frontDotNL * frontIndirectLight.color * BRDF_Diffuse_Lambert( frontIndirectLight, geometry, diffuse );
vLightBack = backReflectedLight.diffuse;
#ifdef DOUBLE_SIDED
float backDotNL = saturate( dot( -geometry.normal, backIndirectLight.direction ) );
vLightBack += backDotNL * backIndirectLight.color * BRDF_Diffuse_Lambert( backIndirectLight, backGeometry, diffuse );
#endif
#endif
\ No newline at end of file
}
\ No newline at end of file
......@@ -122,7 +122,7 @@ uniform vec3 ambientLightColor;
#endif
#ifdef USE_ENVMAP
#if defined( USE_ENVMAP ) && defined( PHYSICAL )
IncidentLight getSpecularLightProbeIndirectLight( /*const in SpecularLightProbe specularLightProbe,*/ const in GeometricContext geometry, const in float lodLevel ) {
......
......@@ -101,14 +101,13 @@ THREE.ShaderLib = {
" ReflectedLight indirectReflectedLight = ReflectedLight( vec3( 0.0 ), diffuse );",
THREE.ShaderChunk[ "aomap_fragment" ],
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "shadowmap_fragment" ],
"indirectReflectedLight.diffuse *= shadowMask;",
"vec3 outgoingLight = indirectReflectedLight.diffuse;",
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
" gl_FragColor = vec4( outgoingLight, diffuseColor.a );",
......@@ -241,6 +240,8 @@ THREE.ShaderLib = {
" #endif",
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
......@@ -388,7 +389,6 @@ THREE.ShaderLib = {
THREE.ShaderChunk[ "lightmap_fragment" ],
// modulation
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "aomap_fragment" ],
"vec3 shadowMask = vec3( 1.0 );",
......@@ -406,6 +406,7 @@ THREE.ShaderLib = {
"#endif",
THREE.ShaderChunk[ "envmap_fragment" ],
THREE.ShaderChunk[ "linear_to_gamma_fragment" ],
THREE.ShaderChunk[ "fog_fragment" ],
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册