Forráskód Böngészése

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 éve
szülő
commit
a4a931b1d6

+ 19 - 1
src/materials/MeshPhysicalMaterial.js

@@ -34,6 +34,7 @@ import * as MathUtils from '../math/MathUtils.js';
 
 class MeshPhysicalMaterial extends MeshStandardMaterial {
 
+	#clearcoat = 0;
 	#transmission = 0;
 
 	constructor( parameters ) {
@@ -49,7 +50,6 @@ class MeshPhysicalMaterial extends MeshStandardMaterial {
 
 		this.type = 'MeshPhysicalMaterial';
 
-		this.clearcoat = 0.0;
 		this.clearcoatMap = null;
 		this.clearcoatRoughness = 0.0;
 		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() {
 
 		return this.#transmission;

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

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

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

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

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

@@ -20,7 +20,7 @@ geometry.position = - vViewPosition;
 geometry.normal = normal;
 geometry.viewDir = ( isOrthographic ) ? vec3( 0, 0, 1 ) : normalize( vViewPosition );
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 
 	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 );
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 		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
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 
 	material.clearcoat = clearcoat;
 	material.clearcoatRoughness = clearcoatRoughness;

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

@@ -6,7 +6,7 @@ struct PhysicalMaterial {
 	vec3 specularColor;
 	float specularF90;
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 		float clearcoat;
 		float clearcoatRoughness;
 		vec3 clearcoatF0;
@@ -120,7 +120,7 @@ void RE_Direct_Physical( const in IncidentLight directLight, const in GeometricC
 
 	vec3 irradiance = dotNL * directLight.color;
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 		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) {
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 		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
 	#define IOR
-	#define CLEARCOAT
 	#define SPECULAR
 #endif
 
@@ -30,7 +29,7 @@ uniform float opacity;
 	#endif
 #endif
 
-#ifdef CLEARCOAT
+#ifdef USE_CLEARCOAT
 	uniform float clearcoat;
 	uniform float clearcoatRoughness;
 #endif
@@ -107,7 +106,7 @@ void main() {
 
 	vec3 outgoingLight = totalDiffuse + totalSpecular + totalEmissiveRadiance;
 
-	#ifdef CLEARCOAT
+	#ifdef USE_CLEARCOAT
 
 		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.clearcoat.value = material.clearcoat;
-		uniforms.clearcoatRoughness.value = material.clearcoatRoughness;
-
 		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 ) {
 
+	// TODO Send this event to Three.js DevTools
+	// console.log( 'WebGLProgram', cacheKey );
+
 	const gl = renderer.getContext();
 
 	const defines = parameters.defines;
@@ -470,13 +473,17 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
 			parameters.displacementMap && parameters.supportsVertexTextures ? '#define USE_DISPLACEMENTMAP' : '',
+
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			parameters.specularTintMap ? '#define USE_SPECULARTINTMAP' : '',
+
 			parameters.roughnessMap ? '#define USE_ROUGHNESSMAP' : '',
 			parameters.metalnessMap ? '#define USE_METALNESSMAP' : '',
 			parameters.alphaMap ? '#define USE_ALPHAMAP' : '',
+
 			parameters.transmission ? '#define USE_TRANSMISSION' : '',
 			parameters.transmissionMap ? '#define USE_TRANSMISSIONMAP' : '',
 			parameters.thicknessMap ? '#define USE_THICKNESSMAP' : '',
@@ -611,9 +618,12 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			parameters.normalMap ? '#define USE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.objectSpaceNormalMap ) ? '#define OBJECTSPACE_NORMALMAP' : '',
 			( parameters.normalMap && parameters.tangentSpaceNormalMap ) ? '#define TANGENTSPACE_NORMALMAP' : '',
+
+			parameters.clearcoat ? '#define USE_CLEARCOAT' : '',
 			parameters.clearcoatMap ? '#define USE_CLEARCOATMAP' : '',
 			parameters.clearcoatRoughnessMap ? '#define USE_CLEARCOAT_ROUGHNESSMAP' : '',
 			parameters.clearcoatNormalMap ? '#define USE_CLEARCOAT_NORMALMAP' : '',
+
 			parameters.specularMap ? '#define USE_SPECULARMAP' : '',
 			parameters.specularIntensityMap ? '#define USE_SPECULARINTENSITYMAP' : '',
 			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',
 		'map', 'mapEncoding', 'matcap', 'matcapEncoding', 'envMap', 'envMapMode', 'envMapEncoding', 'envMapCubeUV',
 		'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',
 		'alphaMap', 'combine', 'vertexColors', 'vertexAlphas', 'vertexTangents', 'vertexUvs', 'uvsVertexOnly', 'fog', 'useFog', 'fogExp2',
 		'flatShading', 'sizeAttenuation', 'logarithmicDepthBuffer', 'skinning',
@@ -152,6 +154,8 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 
 		const currentRenderTarget = renderer.getRenderTarget();
 
+		const useClearcoat = material.clearcoat > 0;
+
 		const parameters = {
 
 			isWebGL2: isWebGL2,
@@ -190,9 +194,12 @@ function WebGLPrograms( renderer, cubemaps, cubeuvmaps, extensions, capabilities
 			normalMap: !! material.normalMap,
 			objectSpaceNormalMap: material.normalMapType === ObjectSpaceNormalMap,
 			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,
 			roughnessMap: !! material.roughnessMap,
 			metalnessMap: !! material.metalnessMap,