Przeglądaj źródła

WebGLRenderer: Implement normal bias fallback. (#33391)

Michael Herzog 4 dni temu
rodzic
commit
740dd76c69

BIN
examples/screenshots/webgl_shadowmap_performance.jpg


+ 12 - 2
src/renderers/shaders/ShaderChunk/shadowmap_vertex.glsl.js

@@ -2,8 +2,18 @@ export default /* glsl */`
 
 #if ( defined( USE_SHADOWMAP ) && ( NUM_DIR_LIGHT_SHADOWS > 0 || NUM_POINT_LIGHT_SHADOWS > 0 ) ) || ( NUM_SPOT_LIGHT_COORDS > 0 )
 
-	// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.
-	vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
+	#ifdef HAS_NORMAL
+
+		// Offsetting the position used for querying occlusion along the world normal can be used to reduce shadow acne.
+
+		vec3 shadowWorldNormal = inverseTransformDirection( transformedNormal, viewMatrix );
+
+	#else
+
+		vec3 shadowWorldNormal = vec3( 0.0 ); // fallback, see #21483
+
+	#endif
+
 	vec4 shadowWorldPosition;
 
 #endif

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

@@ -563,6 +563,7 @@ function WebGLProgram( renderer, cacheKey, parameters, bindingStates ) {
 			//
 
 			parameters.vertexTangents && parameters.flatShading === false ? '#define USE_TANGENT' : '',
+			parameters.vertexNormals ? '#define HAS_NORMAL' : '',
 			parameters.vertexColors ? '#define USE_COLOR' : '',
 			parameters.vertexAlphas ? '#define USE_COLOR_ALPHA' : '',
 			parameters.vertexUv1s ? '#define USE_UV1' : '',

+ 3 - 0
src/renderers/webgl/WebGLPrograms.js

@@ -301,6 +301,7 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin
 			//
 
 			vertexTangents: !! geometry.attributes.tangent && ( HAS_NORMALMAP || HAS_ANISOTROPY ),
+			vertexNormals: !! geometry.attributes.normal,
 			vertexColors: material.vertexColors,
 			vertexAlphas: material.vertexColors === true && !! geometry.attributes.color && geometry.attributes.color.itemSize === 4,
 
@@ -530,6 +531,8 @@ function WebGLPrograms( renderer, environments, extensions, capabilities, bindin
 			_programLayers.enable( 21 );
 		if ( parameters.packedNormalMap )
 			_programLayers.enable( 22 );
+		if ( parameters.vertexNormals )
+			_programLayers.enable( 23 );
 
 		array.push( _programLayers.mask );
 		_programLayers.disableAll();

粤ICP备19079148号