Browse Source

Fix DoF artifacting at high blur amounts

ceLoFaN 3 years ago
parent
commit
e844b95eaf

+ 3 - 2
servers/rendering/renderer_rd/shaders/effects/bokeh_dof.glsl

@@ -186,6 +186,7 @@ void main() {
 	uv += pixel_size * 0.5; //half pixel to read centers
 	uv += pixel_size * 0.5; //half pixel to read centers
 
 
 	vec4 color = texture(color_texture, uv);
 	vec4 color = texture(color_texture, uv);
+	float initial_blur = color.a;
 	float accum = 1.0;
 	float accum = 1.0;
 	float radius = params.blur_scale;
 	float radius = params.blur_scale;
 
 
@@ -193,8 +194,8 @@ void main() {
 		vec2 suv = uv + vec2(cos(ang), sin(ang)) * pixel_size * radius;
 		vec2 suv = uv + vec2(cos(ang), sin(ang)) * pixel_size * radius;
 		vec4 sample_color = texture(color_texture, suv);
 		vec4 sample_color = texture(color_texture, suv);
 		float sample_size = abs(sample_color.a);
 		float sample_size = abs(sample_color.a);
-		if (sample_color.a > color.a) {
-			sample_size = clamp(sample_size, 0.0, abs(color.a) * 2.0);
+		if (sample_color.a > initial_blur) {
+			sample_size = clamp(sample_size, 0.0, abs(initial_blur) * 2.0);
 		}
 		}
 
 
 		float m = smoothstep(radius - 0.5, radius + 0.5, sample_size);
 		float m = smoothstep(radius - 0.5, radius + 0.5, sample_size);

+ 3 - 6
servers/rendering/renderer_rd/shaders/effects/bokeh_dof_raster.glsl

@@ -221,12 +221,9 @@ void main() {
 		vec4 sample_color = texture(source_color, uv_adj);
 		vec4 sample_color = texture(source_color, uv_adj);
 		sample_color.a = texture(source_weight, uv_adj).r;
 		sample_color.a = texture(source_weight, uv_adj).r;
 
 
-		float limit;
-
-		if (sample_color.a < color.a) {
-			limit = abs(sample_color.a);
-		} else {
-			limit = abs(color.a);
+		float limit = abs(sample_color.a);
+		if (sample_color.a > color.a) {
+			limit = clamp(limit, 0.0, abs(color.a) * 2.0);
 		}
 		}
 
 
 		limit -= DEPTH_GAP;
 		limit -= DEPTH_GAP;