Browse Source

ShadersChunk: Only use clearcoat chunks when clearcoat > 0 (#22405)

* ShadersChunk: Only use clearcoat chunks when clearcoat > 0

* WebGLProgram: Removed clearcoat checks.

* WebGLMaterials: Only update clearcoat uniforms when material.clearcoat > 0.

* WebGLProgram: Add clearcoat checks again.

* WebGLProgram: Added commented out convenience log.
Mr.doob 3 years ago
parent
commit
a4a931b1d6

+ 19 - 1
src/materials/MeshPhysicalMaterial.js

@@ -34,6 +34,7 @@ import * as MathUtils from '../math/MathUtils.js';
 
 
 class MeshPhysicalMaterial extends MeshStandardMaterial {
 class MeshPhysicalMaterial extends MeshStandardMaterial {
 
 
+	#clearcoat = 0;
 	#transmission = 0;
 	#transmission = 0;
 
 
 	constructor( parameters ) {
 	constructor( parameters ) {
@@ -49,7 +50,6 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
 
 
 		this.type = 'MeshPhysicalMaterial';
 		this.type = 'MeshPhysicalMaterial';
 
 
-		this.clearcoat = 0.0;
 		this.clearcoatMap = null;
 		this.clearcoatMap = null;
 		this.clearcoatRoughness = 0.0;
 		this.clearcoatRoughness = 0.0;
 		this.clearcoatRoughnessMap = null;
 		this.clearcoatRoughnessMap = null;
@@ -90,6 +90,24 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
 
 
 	}
 	}
 
 
+	get clearcoat() {
+
+		return this.#clearcoat;
+
+	}
+
+	set clearcoat( value ) {
+
+		if ( this.#clearcoat > 0 !== value > 0 ) {
+
+			this.version ++;
+
+		}
+
+		this.#clearcoat = value;
+
+	}
+
 	get transmission() {
 	get transmission() {
 
 
 		return this.#transmission;
 		return this.#transmission;

+ 1 - 1
src/renderers/shaders/ShaderChunk/clearcoat_normal_fragment_begin.glsl.js

@@ -1,5 +1,5 @@
 export default /* glsl */`
 export default /* glsl */`
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 
 
 	vec3 clearcoatNormal = geometryNormal;
 	vec3 clearcoatNormal = geometryNormal;
 
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/common.glsl.js

@@ -55,7 +55,7 @@ struct GeometricContext {
 	vec3 position;
 	vec3 position;
 	vec3 normal;
 	vec3 normal;
 	vec3 viewDir;
 	vec3 viewDir;
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 	vec3 clearcoatNormal;
 	vec3 clearcoatNormal;
 #endif
 #endif
 };
 };

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_fragment_begin.glsl.js

@@ -20,7 +20,7 @@ geometry.position = - vViewPosition;
 geometry.normal = normal;
 geometry.normal = normal;
 geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
 geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
 
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 
 
 	geometry.clearcoatNormal = clearcoatNormal;
 	geometry.clearcoatNormal = clearcoatNormal;
 
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_fragment_maps.glsl.js

@@ -28,7 +28,7 @@ export default /* glsl */`
 
 
 	radiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );
 	radiance += getIBLRadiance( geometry.viewDir, geometry.normal, material.roughness );
 
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 
 		clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );
 		clearcoatRadiance += getIBLRadiance( geometry.viewDir, geometry.clearcoatNormal, material.clearcoatRoughness );
 
 

+ 1 - 1
src/renderers/shaders/ShaderChunk/lights_physical_fragment.glsl.js

@@ -47,7 +47,7 @@ material.roughness = min( material.roughness, 1.0 );
 
 
 #endif
 #endif
 
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 
 
 	material.clearcoat = clearcoat;
 	material.clearcoat = clearcoat;
 	material.clearcoatRoughness = clearcoatRoughness;
 	material.clearcoatRoughness = clearcoatRoughness;

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

@@ -6,7 +6,7 @@ struct PhysicalMaterial {
 	vec3 specularColor;
 	vec3 specularColor;
 	float specularF90;
 	float specularF90;
 
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 		float clearcoat;
 		float clearcoat;
 		float clearcoatRoughness;
 		float clearcoatRoughness;
 		vec3 clearcoatF0;
 		vec3 clearcoatF0;
@@ -120,7 +120,7 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricC
 
 
 	vec3 irradiance = dotNL * directLight.color;
 	vec3 irradiance = dotNL * directLight.color;
 
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 
 		float dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );
 		float dotNLcc = saturate( dot( geometry.clearcoatNormal, directLight.direction ) );
 
 
@@ -151,7 +151,7 @@ void RE_IndirectDiffuse_Physical( const in vec3 irradiance, const in GeometricCo
 
 
 void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {
 void RE_IndirectSpecular_Physical( const in vec3 radiance, const in vec3 irradiance, const in vec3 clearcoatRadiance, const in GeometricContext geometry, const in PhysicalMaterial material, inout ReflectedLight reflectedLight) {
 
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 
 		clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
 		clearcoatSpecular += clearcoatRadiance * EnvironmentBRDF( geometry.clearcoatNormal, geometry.viewDir, material.clearcoatF0, material.clearcoatF90, material.clearcoatRoughness );
 
 

+ 2 - 3
src/renderers/shaders/ShaderLib/meshphysical_frag.glsl.js

@@ -3,7 +3,6 @@ export default /* glsl */`
 
 
 #ifdef PHYSICAL
 #ifdef PHYSICAL
 	#define IOR
 	#define IOR
-	#define CLEARCOAT
 	#define SPECULAR
 	#define SPECULAR
 #endif
 #endif
 
 
@@ -30,7 +29,7 @@ uniform float opacity;
 	#endif
 	#endif
 #endif
 #endif
 
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 	uniform float clearcoat;
 	uniform float clearcoat;
 	uniform float clearcoatRoughness;
 	uniform float clearcoatRoughness;
 #endif
 #endif
@@ -107,7 +106,7 @@ void main() {
 
 
 	vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
 	vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
 
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 
 		float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );
 		float dotNVcc = saturate( dot( geometry.clearcoatNormal, geometry.viewDir ) );
 
 

+ 18 - 14
src/renderers/webgl/WebGLMaterials.js

@@ -580,31 +580,35 @@ function WebGLMaterials( properties ) {
 
 
 		uniforms.ior.value = material.ior; // also part of uniforms common
 		uniforms.ior.value = material.ior; // also part of uniforms common
 
 
-		uniforms.clearcoat.value = material.clearcoat;
-		uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
-
 		if ( material.sheenTint ) uniforms.sheenTint.value.copy( material.sheenTint );
 		if ( material.sheenTint ) uniforms.sheenTint.value.copy( material.sheenTint );
 
 
-		if ( material.clearcoatMap ) {
+		if ( material.clearcoat > 0 ) {
 
 
-			uniforms.clearcoatMap.value = material.clearcoatMap;
+			uniforms.clearcoat.value = material.clearcoat;
+			uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
 
 
-		}
+			if ( material.clearcoatMap ) {
 
 
-		if ( material.clearcoatRoughnessMap ) {
+				uniforms.clearcoatMap.value = material.clearcoatMap;
 
 
-			uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
+			}
 
 
-		}
+			if ( material.clearcoatRoughnessMap ) {
+
+				uniforms.clearcoatRoughnessMap.value = material.clearcoatRoughnessMap;
+
+			}
+
+			if ( material.clearcoatNormalMap ) {
 
 
-		if ( material.clearcoatNormalMap ) {
+				uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
+				uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
 
 
-			uniforms.clearcoatNormalScale.value.copy( material.clearcoatNormalScale );
-			uniforms.clearcoatNormalMap.value = material.clearcoatNormalMap;
+				if ( material.side === BackSide ) {
 
 
-			if ( material.side === BackSide ) {
+					uniforms.clearcoatNormalScale.value.negate();
 
 
-				uniforms.clearcoatNormalScale.value.negate();
+				}
 
 
 			}
 			}
 
 

+ 10 - 0
src/renderers/webgl/WebGLProgram.js

@@ -384,6 +384,9 @@ function generateEnvMapBlendingDefine( parameters ) {
 
 
 function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 
 
+	// TODO Send this event to Three.js DevTools
+	// console.log( 'WebGLProgram', cacheKey );
+
 	const gl = renderer.getContext();
 	const gl = renderer.getContext();
 
 
 	const defines = parameters.defines;
 	const defines = parameters.defines;
@@ -470,13 +473,17 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
 			parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
 			parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
+
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			parameters.specularTintMap ? '#define USE_SPECULARTINTMAP' : '',
 			parameters.specularTintMap ? '#define USE_SPECULARTINTMAP' : '',
+
 			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
 			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
 			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
 			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
 			parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
 			parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
+
 			parameters.transmission ? '#define USE_TRANSMISSION' : '',
 			parameters.transmission ? '#define USE_TRANSMISSION' : '',
 			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
 			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
 			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
 			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
@@ -611,9 +618,12 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.normalMap ? '#define USE_NORMALMAP' : '',
 			parameters.normalMap ? '#define USE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+
+			parameters.clearcoat ? '#define USE_CLEARCOAT' : '',
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			parameters.specularTintMap ? '#define USE_SPECULARTINTMAP' : '',
 			parameters.specularTintMap ? '#define USE_SPECULARTINTMAP' : '',

+ 11 - 4
src/renderers/webgl/WebGLPrograms.js

@@ -37,7 +37,9 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 		'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor',
 		'precision', 'isWebGL2', 'supportsVertexTextures', 'outputEncoding', 'instancing', 'instancingColor',
 		'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',
 		'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',
 		'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap',
 		'lightMap', 'lightMapEncoding', 'aoMap', 'emissiveMap', 'emissiveMapEncoding', 'bumpMap', 'normalMap',
-		'objectSpaceNormalMap', 'tangentSpaceNormalMap', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap', 'displacementMap',
+		'objectSpaceNormalMap', 'tangentSpaceNormalMap',
+		'clearcoat', 'clearcoatMap', 'clearcoatRoughnessMap', 'clearcoatNormalMap',
+		'displacementMap',
 		'specularMap', 'specularIntensityMap', 'specularTintMap', 'specularTintMapEncoding', 'roughnessMap', 'metalnessMap', 'gradientMap',
 		'specularMap', 'specularIntensityMap', 'specularTintMap', 'specularTintMapEncoding', 'roughnessMap', 'metalnessMap', 'gradientMap',
 		'alphaMap', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',
 		'alphaMap', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',
 		'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',
 		'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',
@@ -152,6 +154,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 
 
 		const currentRenderTarget = renderer.getRenderTarget();
 		const currentRenderTarget = renderer.getRenderTarget();
 
 
+		const useClearcoat = material.clearcoat > 0;
+
 		const parameters = {
 		const parameters = {
 
 
 			isWebGL2: isWebGL2,
 			isWebGL2: isWebGL2,
@@ -190,9 +194,12 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			normalMap: !! material.normalMap,
 			normalMap: !! material.normalMap,
 			objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
 			objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
 			tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,
 			tangentSpaceNormalMap: material.normalMapType === TangentSpaceNormalMap,
-			clearcoatMap: !! material.clearcoatMap,
-			clearcoatRoughnessMap: !! material.clearcoatRoughnessMap,
-			clearcoatNormalMap: !! material.clearcoatNormalMap,
+
+			clearcoat: useClearcoat,
+			clearcoatMap: useClearcoat && !! material.clearcoatMap,
+			clearcoatRoughnessMap: useClearcoat && !! material.clearcoatRoughnessMap,
+			clearcoatNormalMap: useClearcoat && !! material.clearcoatNormalMap,
+
 			displacementMap: !! material.displacementMap,
 			displacementMap: !! material.displacementMap,
 			roughnessMap: !! material.roughnessMap,
 			roughnessMap: !! material.roughnessMap,
 			metalnessMap: !! material.metalnessMap,
 			metalnessMap: !! material.metalnessMap,