diff options
Diffstat (limited to 'servers/rendering/renderer_rd/shaders')
3 files changed, 43 insertions, 15 deletions
diff --git a/servers/rendering/renderer_rd/shaders/canvas.glsl b/servers/rendering/renderer_rd/shaders/canvas.glsl index fbc641ee9e..f8e9020f9f 100644 --- a/servers/rendering/renderer_rd/shaders/canvas.glsl +++ b/servers/rendering/renderer_rd/shaders/canvas.glsl @@ -461,10 +461,6 @@ float msdf_median(float r, float g, float b, float a) {  	return min(max(min(r, g), min(max(r, g), b)), a);  } -vec2 msdf_map(vec2 value, vec2 in_min, vec2 in_max, vec2 out_min, vec2 out_max) { -	return out_min + (out_max - out_min) * (value - in_min) / (in_max - in_min); -} -  void main() {  	vec4 color = color_interp;  	vec2 uv = uv_interp; diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl index 4e6e50bc44..58b4ded9f4 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_clustered.glsl @@ -499,14 +499,14 @@ layout(location = 1) out uvec2 voxel_gi_buffer;  #endif //MODE_RENDER_NORMAL  #else // RENDER DEPTH -#ifdef MODE_MULTIPLE_RENDER_TARGETS +#ifdef MODE_SEPARATE_SPECULAR  layout(location = 0) out vec4 diffuse_buffer; //diffuse (rgb) and roughness  layout(location = 1) out vec4 specular_buffer; //specular and SSS (subsurface scatter)  #else  layout(location = 0) out vec4 frag_color; -#endif // MODE_MULTIPLE_RENDER_TARGETS +#endif // MODE_SEPARATE_SPECULAR  #endif // RENDER DEPTH @@ -1479,62 +1479,78 @@ void main() {  				} else { //no soft shadows  					vec4 pssm_coord; +					float blur_factor; +  					if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 0)  						pssm_coord = (directional_lights.data[i].shadow_matrix1 * v); +						blur_factor = 1.0;  					} else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 1)  						pssm_coord = (directional_lights.data[i].shadow_matrix2 * v); +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.y;  					} else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 2)  						pssm_coord = (directional_lights.data[i].shadow_matrix3 * v); - +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.z;  					} else {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 3)  						pssm_coord = (directional_lights.data[i].shadow_matrix4 * v); +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.w;  					}  					pssm_coord /= pssm_coord.w; -					shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); +					shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale * blur_factor, pssm_coord);  					if (directional_lights.data[i].blend_splits) {  						float pssm_blend; +						float blur_factor2;  						if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {  							vec4 v = vec4(vertex, 1.0);  							BIAS_FUNC(v, 1)  							pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);  							pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z); +							// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +							blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.y;  						} else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {  							vec4 v = vec4(vertex, 1.0);  							BIAS_FUNC(v, 2)  							pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);  							pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z); +							// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +							blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.z;  						} else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {  							vec4 v = vec4(vertex, 1.0);  							BIAS_FUNC(v, 3)  							pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);  							pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z); +							// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +							blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.w;  						} else {  							pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached) +							blur_factor2 = 1.0;  						}  						pssm_coord /= pssm_coord.w; -						float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); +						float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale * blur_factor2, pssm_coord);  						shadow = mix(shadow, shadow2, pssm_blend);  					}  				} @@ -1966,7 +1982,7 @@ void main() {  	//restore fog  	fog = vec4(unpackHalf2x16(fog_rg), unpackHalf2x16(fog_ba)); -#ifdef MODE_MULTIPLE_RENDER_TARGETS +#ifdef MODE_SEPARATE_SPECULAR  #ifdef MODE_UNSHADED  	diffuse_buffer = vec4(albedo.rgb, 0.0); @@ -1984,7 +2000,7 @@ void main() {  	diffuse_buffer.rgb = mix(diffuse_buffer.rgb, fog.rgb, fog.a);  	specular_buffer.rgb = mix(specular_buffer.rgb, vec3(0.0), fog.a); -#else //MODE_MULTIPLE_RENDER_TARGETS +#else //MODE_SEPARATE_SPECULAR  #ifdef MODE_UNSHADED  	frag_color = vec4(albedo, alpha); @@ -1996,7 +2012,7 @@ void main() {  	// Draw "fixed" fog before volumetric fog to ensure volumetric fog can appear in front of the sky.  	frag_color.rgb = mix(frag_color.rgb, fog.rgb, fog.a); -#endif //MODE_MULTIPLE_RENDER_TARGETS +#endif //MODE_SEPARATE_SPECULAR  #endif //MODE_RENDER_DEPTH  } diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl index 6911cab27b..b6ba244665 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_mobile.glsl @@ -1282,6 +1282,7 @@ void main() {  				float depth_z = -vertex.z;  				vec4 pssm_coord; +				float blur_factor;  				vec3 light_dir = directional_lights.data[i].direction;  				vec3 base_normal_bias = normalize(normal_interp) * (1.0 - max(0.0, dot(light_dir, -normalize(normal_interp)))); @@ -1297,56 +1298,71 @@ void main() {  					BIAS_FUNC(v, 0)  					pssm_coord = (directional_lights.data[i].shadow_matrix1 * v); +					blur_factor = 1.0;  				} else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {  					vec4 v = vec4(vertex, 1.0);  					BIAS_FUNC(v, 1)  					pssm_coord = (directional_lights.data[i].shadow_matrix2 * v); +					// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +					blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.y; +					;  				} else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {  					vec4 v = vec4(vertex, 1.0);  					BIAS_FUNC(v, 2)  					pssm_coord = (directional_lights.data[i].shadow_matrix3 * v); - +					// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +					blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.z;  				} else {  					vec4 v = vec4(vertex, 1.0);  					BIAS_FUNC(v, 3)  					pssm_coord = (directional_lights.data[i].shadow_matrix4 * v); +					// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +					blur_factor = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.w;  				}  				pssm_coord /= pssm_coord.w; -				shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); +				shadow = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale * blur_factor, pssm_coord);  				if (directional_lights.data[i].blend_splits) {  					float pssm_blend; +					float blur_factor2;  					if (depth_z < directional_lights.data[i].shadow_split_offsets.x) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 1)  						pssm_coord = (directional_lights.data[i].shadow_matrix2 * v);  						pssm_blend = smoothstep(0.0, directional_lights.data[i].shadow_split_offsets.x, depth_z); +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.y;  					} else if (depth_z < directional_lights.data[i].shadow_split_offsets.y) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 2)  						pssm_coord = (directional_lights.data[i].shadow_matrix3 * v);  						pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.x, directional_lights.data[i].shadow_split_offsets.y, depth_z); +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.z;  					} else if (depth_z < directional_lights.data[i].shadow_split_offsets.z) {  						vec4 v = vec4(vertex, 1.0);  						BIAS_FUNC(v, 3)  						pssm_coord = (directional_lights.data[i].shadow_matrix4 * v);  						pssm_blend = smoothstep(directional_lights.data[i].shadow_split_offsets.y, directional_lights.data[i].shadow_split_offsets.z, depth_z); +						// Adjust shadow blur with reference to the first split to reduce discrepancy between shadow splits. +						blur_factor2 = directional_lights.data[i].shadow_split_offsets.x / directional_lights.data[i].shadow_split_offsets.w;  					} else {  						pssm_blend = 0.0; //if no blend, same coord will be used (divide by z will result in same value, and already cached) +						blur_factor2 = 1.0;  					}  					pssm_coord /= pssm_coord.w; -					float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale, pssm_coord); +					float shadow2 = sample_directional_pcf_shadow(directional_shadow_atlas, scene_data.directional_shadow_pixel_size * directional_lights.data[i].soft_shadow_scale * blur_factor2, pssm_coord);  					shadow = mix(shadow, shadow2, pssm_blend);  				}  |