Browse Source

Add maximum roughness cutoff to SSR to improve performance

In a test scene with mixed rough and non-rough materials, this saves
upwards of 0.15 ms of GPU time with very little visual artifacting
(GTX 1080, 2560×1440).
Hugo Locurcio 3 years ago
parent
commit
7745bd42a6

+ 13 - 3
servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl

@@ -66,6 +66,19 @@ void main() {
 
 	vec4 normal_roughness = imageLoad(source_normal_roughness, ssC);
 	vec3 normal = normal_roughness.xyz * 2.0 - 1.0;
+	float roughness = normal_roughness.w;
+
+	// The roughness cutoff of 0.6 is chosen to match the roughness fadeout from GH-69828.
+	if (roughness > 0.6) {
+		// Do not compute SSR for rough materials to improve performance at the cost of
+		// subtle artifacting.
+#ifdef MODE_ROUGH
+		imageStore(blur_radius_image, ssC, vec4(0.0));
+#endif
+		imageStore(ssr_image, ssC, vec4(0.0));
+		return;
+	}
+
 	normal = normalize(normal);
 	normal.y = -normal.y; //because this code reads flipped
 
@@ -81,8 +94,6 @@ void main() {
 		imageStore(ssr_image, ssC, vec4(0.0));
 		return;
 	}
-	//ray_dir = normalize(view_dir - normal * dot(normal,view_dir) * 2.0);
-	//ray_dir = normalize(vec3(1.0, 1.0, -1.0));
 
 	////////////////
 
@@ -220,7 +231,6 @@ void main() {
 
 		// if roughness is enabled, do screen space cone tracing
 		float blur_radius = 0.0;
-		float roughness = normal_roughness.w;
 
 		if (roughness > 0.001) {
 			float cone_angle = min(roughness, 0.999) * M_PI * 0.5;