[Bf-blender-cvs] [84c91be0a4b] blender2.8: Eevee: Fix noise correlation in the blue noise update.

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


Commit: 84c91be0a4bf83f815406d8f707a60cb51a06d3b
Author: Clément Foucault
Date:   Mon Jan 15 17:14:49 2018 +0100
Branches: blender2.8
https://developer.blender.org/rB84c91be0a4bf83f815406d8f707a60cb51a06d3b

Eevee: Fix noise correlation in the blue noise update.

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

M	source/blender/draw/engines/eevee/eevee_engine.c
M	source/blender/draw/engines/eevee/eevee_materials.c
M	source/blender/draw/engines/eevee/eevee_private.h
M	source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
M	source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index c49edd8a5e4..e9c4a1a7727 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -168,23 +168,21 @@ static void eevee_draw_background(void *vedata)
 	int loop_ct = DRW_state_is_image_render() ? 4 : 1;
 
 	while (loop_ct--) {
+		unsigned int primes[3] = {2, 3, 7};
+		double offset[3] = {0.0, 0.0, 0.0};
+		double r[3];
 
-		/* XXX temp for denoising render. TODO plug number of samples here */
 		if (DRW_state_is_image_render()) {
-			double r;
-			BLI_halton_1D(2, 0.0, stl->effects->taa_current_sample - 1, &r);
-
+			BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
 			/* Set jitter offset */
 			/* PERF This is killing perf ! */
-			EEVEE_update_util_texture((float)r);
+			EEVEE_update_util_texture(r);
 		}
-		else if (((stl->effects->enabled_effects & EFFECT_TAA) != 0) && (stl->effects->taa_current_sample > 1)) {
-			double r;
-			BLI_halton_1D(2, 0.0, stl->effects->taa_current_sample - 1, &r);
-
+		else if ((stl->effects->enabled_effects & EFFECT_TAA) != 0) {
+			BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
 			/* Set jitter offset */
 			/* PERF This is killing perf ! */
-			EEVEE_update_util_texture((float)r);
+			EEVEE_update_util_texture(r);
 		}
 
 		/* Refresh Probes */
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index 0aea80f5471..5bd7fe979b8 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -432,7 +432,7 @@ static void create_default_shader(int options)
 	MEM_freeN(frag_str);
 }
 
-void EEVEE_update_util_texture(float offset)
+void EEVEE_update_util_texture(double offsets[3])
 {
 
 	/* TODO: split this into 2 functions : one for init,
@@ -456,12 +456,9 @@ void EEVEE_update_util_texture(float offset)
 
 	/* Copy blue noise in 3rd layer  */
 	for (int i = 0; i < 64 * 64; i++) {
-		float noise;
-		noise = fmod(blue_noise[i][0] + offset, 1.0f);
-		texels_layer[i][0] = noise;
-
-		noise = fmod(blue_noise[i][1] + offset, 1.0f);
-		texels_layer[i][1] = noise * 0.5f + 0.5f;
+		texels_layer[i][0] = fmod(blue_noise[i][0] + (float)offsets[0], 1.0f);
+		texels_layer[i][1] = fmod(blue_noise[i][1] + (float)offsets[1], 1.0f);
+		float noise = fmod(blue_noise[i][1] + (float)offsets[2], 1.0f);
 		texels_layer[i][2] = cosf(noise * 2.0f * M_PI);
 		texels_layer[i][3] = sinf(noise * 2.0f * M_PI);
 	}
@@ -549,7 +546,8 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
 
 		MEM_freeN(frag_str);
 
-		EEVEE_update_util_texture(0.0f);
+		double offsets[3] = {0.0, 0.0, 0.0};
+		EEVEE_update_util_texture(offsets);
 	}
 
 	{
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index b1ea68debc4..c1108dd7dc7 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -743,7 +743,7 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material
 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma, int shadow_method);
 void EEVEE_materials_free(void);
 void EEVEE_draw_default_passes(EEVEE_PassList *psl);
-void EEVEE_update_util_texture(float offset);
+void EEVEE_update_util_texture(double offsets[3]);
 
 /* eevee_lights.c */
 void EEVEE_lights_init(EEVEE_ViewLayerData *sldata);
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
index 13586619fe9..11faec58d40 100644
--- a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl
@@ -14,7 +14,6 @@ uniform sampler2DArray utilTex;
 void setup_noise(void)
 {
 	jitternoise = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0)).rg; /* Global variable */
-	jitternoise.g = (jitternoise.g - 0.5) * 2.0;
 }
 
 #ifdef HAMMERSLEY_SIZE
diff --git a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
index fcc26c548cf..c731dcda742 100644
--- a/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lamps_lib.glsl
@@ -203,14 +203,13 @@ float light_visibility(LightData ld, vec3 W,
 			vec3 T, B;
 			make_orthonormal_basis(L.xyz / L.w, T, B);
 
-			vec3 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0)).xzw;
-			/* XXX This is a hack to not have noise correlation artifacts.
-			 * A better solution to have better noise is welcome. */
-			rand.yz *= fast_sqrt(fract(rand.x * 7919.0)) * data.sh_contact_spread;
+			vec4 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0));
+			/* WATCH THIS : This still seems to have correlation artifacts for low samples. */
+			rand.zw *= fast_sqrt(rand.y) * data.sh_contact_spread;
 
 			/* We use the full l_vector.xyz so that the spread is minimize
 			 * if the shading point is further away from the light source */
-			vec3 ray_dir = L.xyz + T * rand.y + B * rand.z;
+			vec3 ray_dir = L.xyz + T * rand.z + B * rand.w;
 			ray_dir = transform_direction(ViewMatrix, ray_dir);
 			ray_dir = normalize(ray_dir);
 			vec3 ray_origin = viewPosition + viewNormal * data.sh_contact_offset;
@@ -311,14 +310,13 @@ vec3 light_translucent(LightData ld, vec3 W, vec3 N, vec4 l_vector, float scale)
 		vec3 T, B;
 		make_orthonormal_basis(L.xyz / L.w, T, B);
 
-		vec3 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0)).xzw;
-		/* XXX This is a hack to not have noise correlation artifacts.
-		 * A better solution to have better noise is welcome. */
-		rand.yz *= fast_sqrt(fract(rand.x * 7919.0)) * data.sh_blur;
+		vec4 rand = texture(utilTex, vec3(gl_FragCoord.xy / LUT_SIZE, 2.0));
+		/* WATCH THIS : This still seems to have correlation artifacts for low samples. */
+		rand.zw *= fast_sqrt(rand.y) * data.sh_blur;
 
 		/* We use the full l_vector.xyz so that the spread is minimize
 		 * if the shading point is further away from the light source */
-		W = W + T * rand.y + B * rand.z;
+		W = W + T * rand.z + B * rand.w;
 
 		if (ld.l_type == SUN) {
 			ShadowCascadeData scd = shadows_cascade_data[int(data.sh_data_start)];
diff --git a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
index 6e89b7f0d08..9ccfd127536 100644
--- a/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/lit_surface_frag.glsl
@@ -402,7 +402,7 @@ void CLOSURE_NAME(
 	/* ---------------------------- */
 #if defined(CLOSURE_GLOSSY) || defined(CLOSURE_DIFFUSE)
 	vec3 bent_normal;
-	float final_ao = occlusion_compute(N, viewPosition, ao, rand.rg, bent_normal);
+	float final_ao = occlusion_compute(N, viewPosition, ao, rand.zw, bent_normal);
 #endif



More information about the Bf-blender-cvs mailing list