[Bf-blender-cvs] [9365e966b41] blender2.8: Eevee: SSR: Enhance the halfres raytrace.

Clément Foucault noreply at git.blender.org
Tue Jan 16 18:22:36 CET 2018


Commit: 9365e966b415c9a9f6aab180eac25982341519a3
Author: Clément Foucault
Date:   Tue Jan 16 13:18:04 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB9365e966b415c9a9f6aab180eac25982341519a3

Eevee: SSR: Enhance the halfres raytrace.

This make the halfres raytrace actually converge to an antialiased image by jittering the source pixel.

===================================================================

M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/eevee_screen_raytrace.c
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl

===================================================================

diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 5fb25229902..e0468687c6e 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -498,6 +498,7 @@ typedef struct EEVEE_EffectsInfo {
 	bool reflection_trace_full;
 	bool ssr_use_normalization;
 	int ssr_neighbor_ofs;
+	int ssr_halfres_ofs[2];
 	float ssr_firefly_fac;
 	float ssr_border_fac;
 	float ssr_max_roughness;
diff --git a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
index 568b34db088..d704668ea79 100644
--- a/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
+++ b/source/blender/draw/engines/eevee/eevee_screen_raytrace.c
@@ -223,6 +223,9 @@ void EEVEE_screen_raytrace_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *v
 		DRW_shgroup_uniform_float(grp, "maxRoughness", &effects->ssr_max_roughness, 1);
 		DRW_shgroup_uniform_buffer(grp, "planarDepth", &vedata->txl->planar_depth);
 		DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo);
+		if (!effects->reflection_trace_full) {
+			DRW_shgroup_uniform_ivec2(grp, "halfresOffset", effects->ssr_halfres_ofs, 1);
+		}
 		DRW_shgroup_call_add(grp, quad, NULL);
 
 		psl->ssr_resolve = DRW_pass_create("SSR Resolve", DRW_STATE_WRITE_COLOR | DRW_STATE_ADDITIVE);
@@ -310,6 +313,24 @@ void EEVEE_reflection_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *v
 		/* Doing a neighbor shift only after a few iteration. We wait for a prime number of cycles to avoid
 		 * noise correlation. This reduces variance faster. */
 		effects->ssr_neighbor_ofs = ((sample / 5) % 8) * 4;
+		switch ((sample / 11) % 4) {
+			case 0:
+				effects->ssr_halfres_ofs[0] = 0;
+				effects->ssr_halfres_ofs[1] = 0;
+				break;
+			case 1:
+				effects->ssr_halfres_ofs[0] = 0;
+				effects->ssr_halfres_ofs[1] = 1;
+				break;
+			case 2:
+				effects->ssr_halfres_ofs[0] = 1;
+				effects->ssr_halfres_ofs[1] = 0;
+				break;
+			case 4:
+				effects->ssr_halfres_ofs[0] = 1;
+				effects->ssr_halfres_ofs[1] = 1;
+				break;
+		}
 		DRW_framebuffer_texture_detach(dtxl->depth);
 		DRW_framebuffer_texture_detach(txl->ssr_normal_input);
 		DRW_framebuffer_texture_detach(txl->ssr_specrough_input);
diff --git a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
index 6c770fa029f..d615baba161 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -12,6 +12,7 @@ uniform sampler2DArray utilTex;
 
 uniform float fireflyFactor;
 uniform float maxRoughness;
+uniform ivec2 halfresOffset;
 
 ivec2 encode_hit_data(vec2 hit_pos, bool has_hit, bool is_planar)
 {
@@ -97,7 +98,7 @@ void main()
 	ivec2 fullres_texel = ivec2(gl_FragCoord.xy);
 	ivec2 halfres_texel = fullres_texel;
 #else
-	ivec2 fullres_texel = ivec2(gl_FragCoord.xy) * 2;
+	ivec2 fullres_texel = ivec2(gl_FragCoord.xy) * 2 + halfresOffset;
 	ivec2 halfres_texel = ivec2(gl_FragCoord.xy);
 #endif
 
@@ -107,10 +108,7 @@ void main()
 	if (depth == 1.0)
 		discard;
 
-	vec2 uvs = gl_FragCoord.xy / vec2(textureSize(depthBuffer, 0));
-#ifndef FULLRES
-	uvs *= 2.0;
-#endif
+	vec2 uvs = vec2(fullres_texel) / vec2(textureSize(depthBuffer, 0));
 
 	/* Using view space */
 	vec3 viewPosition = get_view_space_from_depth(uvs, depth);



More information about the Bf-blender-cvs mailing list