Jelajahi Sumber

ensure that indirect clear coat is shadowed by specular ambient occlusion (#26941)

* indirect clearcoat is now shadowed by specular ambient occlusion

* switch clearcoat from specularOcclusion to ambientOcclusion

* Update aomap_fragment.glsl.js

---------

Co-authored-by: mrdoob <[email protected]>
Ben Houston 1 tahun lalu
induk
melakukan
661c6bbb97

+ 4 - 0
src/renderers/shaders/ShaderChunk/aomap_fragment.glsl.js

@@ -6,6 +6,10 @@ export default /* glsl */`
 
 	reflectedLight.indirectDiffuse *= ambientOcclusion;
 
+	#if defined( USE_CLEARCOAT ) 
+		clearcoatSpecularIndirect *= ambientOcclusion;
+	#endif
+
 	#if defined( USE_SHEEN ) 
 		sheenSpecularIndirect *= ambientOcclusion;
 	#endif

+ 4 - 4
src/renderers/shaders/ShaderChunk/lights_physical_pars_fragment.glsl.js

@@ -49,8 +49,8 @@ struct PhysicalMaterial {
 };
 
 // temporary
-vec3 clearcoatSpecular = vec3( 0.0 );
-
+vec3 clearcoatSpecularDirect = vec3( 0.0 );
+vec3 clearcoatSpecularIndirect = vec3( 0.0 );
 vec3 sheenSpecularDirect = vec3( 0.0 );
 vec3 sheenSpecularIndirect = vec3(0.0 );
 
@@ -487,7 +487,7 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in vec3 geome
 
 		vec3 ccIrradiance = dotNLcc * directLight.color;
 
-		clearcoatSpecular += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );
+		clearcoatSpecularDirect += ccIrradiance * BRDF_GGX_Clearcoat( directLight.direction, geometryViewDir, geometryClearcoatNormal, material );
 
 	#endif
 
@@ -512,7 +512,7 @@ void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradia
 
 	#ifdef USE_CLEARCOAT
 
-		clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
+		clearcoatSpecularIndirect += clearcoatRadiance * EnvironmentBRDF( geometryClearcoatNormal, geometryViewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
 
 	#endif
 

+ 1 - 1
src/renderers/shaders/ShaderLib/meshphysical.glsl.js

@@ -207,7 +207,7 @@ void main() {
 
 		vec3 Fcc = F_Schlick( material.clearcoatF0, material.clearcoatF90, dotNVcc );
 
-		outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + clearcoatSpecular * material.clearcoat;
+		outgoingLight = outgoingLight * ( 1.0 - material.clearcoat * Fcc ) + ( clearcoatSpecularDirect + clearcoatSpecularIndirect ) * material.clearcoat;
 
 	#endif