[Bf-blender-cvs] [d007828ae78] blender2.8: Eevee: Offset the for each AA sample.

Clément Foucault noreply at git.blender.org
Mon Aug 21 01:39:40 CEST 2017


Commit: d007828ae78d66cdcc005d9ba3ad57e987f0190a
Author: Clément Foucault
Date:   Mon Aug 21 01:38:14 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBd007828ae78d66cdcc005d9ba3ad57e987f0190a

Eevee: Offset the for each AA sample.

This means we have less overall noise for rendered image.
SSR, AO, and Refraction are affected by this change.

SSR still exhibit artifacts because the reconstruction pattern needs to change every frame (TODO).

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

M	source/blender/draw/engines/eevee/eevee_effects.c
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/ambient_occlusion_lib.glsl
M	source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl

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

diff --git a/source/blender/draw/engines/eevee/eevee_effects.c b/source/blender/draw/engines/eevee/eevee_effects.c
index 0f61b6e967c..ace350cada1 100644
--- a/source/blender/draw/engines/eevee/eevee_effects.c
+++ b/source/blender/draw/engines/eevee/eevee_effects.c
@@ -526,7 +526,6 @@ void EEVEE_effects_init(EEVEE_SceneLayerData *sldata, EEVEE_Data *vedata)
 			effects->ao_settings += 4.0; /* USE_DENOISE */
 		}
 
-		effects->ao_offset = 0.0f;
 		effects->ao_bounce_fac = (float)BKE_collection_engine_property_value_get_bool(props, "gtao_bounce");
 
 		effects->ao_texsize[0] = ((int)viewport_size[0]);
diff --git a/source/blender/draw/engines/eevee/eevee_engine.c b/source/blender/draw/engines/eevee/eevee_engine.c
index 6ea717a0471..99dff4ec51a 100644
--- a/source/blender/draw/engines/eevee/eevee_engine.c
+++ b/source/blender/draw/engines/eevee/eevee_engine.c
@@ -138,7 +138,6 @@ static void EEVEE_cache_finish(void *vedata)
 static void EEVEE_draw_scene(void *vedata)
 {
 	EEVEE_PassList *psl = ((EEVEE_Data *)vedata)->psl;
-	EEVEE_StorageList *stl = ((EEVEE_Data *)vedata)->stl;
 	EEVEE_FramebufferList *fbl = ((EEVEE_Data *)vedata)->fbl;
 	EEVEE_SceneLayerData *sldata = EEVEE_scene_layer_data_get();
 
@@ -153,10 +152,11 @@ static void EEVEE_draw_scene(void *vedata)
 
 	/* XXX temp for denoising render. TODO plug number of samples here */
 	if (DRW_state_is_image_render()) {
-		rand += 1.0f / 8.0f;
+		rand += 1.0f / 16.0f;
 		rand = rand - floorf(rand);
+
 		/* Set jitter offset */
-		stl->effects->ao_offset = rand * stl->effects->ao_samples_inv;
+		EEVEE_update_util_texture(rand);
 	}
 
 	while (loop_ct--) {
diff --git a/source/blender/draw/engines/eevee/eevee_materials.c b/source/blender/draw/engines/eevee/eevee_materials.c
index ef330c424ab..a26c2a4478f 100644
--- a/source/blender/draw/engines/eevee/eevee_materials.c
+++ b/source/blender/draw/engines/eevee/eevee_materials.c
@@ -411,6 +411,61 @@ static void create_default_shader(int options)
 	MEM_freeN(frag_str);
 }
 
+void EEVEE_update_util_texture(float offset)
+{
+	if (e_data.util_tex != NULL) {
+		DRW_TEXTURE_FREE_SAFE(e_data.util_tex);
+	}
+
+	/* TODO: split this into 2 functions : one for init,
+	 * and the other one that updates the noise with the offset. */
+	const int layers = 3 + 16;
+	float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels");
+	float (*texels_layer)[4] = texels;
+
+	/* Copy ltc_mat_ggx into 1st layer */
+	memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64);
+	texels_layer += 64 * 64;
+
+	/* Copy bsdf_split_sum_ggx into 2nd layer red and green channels.
+	   Copy ltc_mag_ggx into 2nd layer blue channel. */
+	for (int i = 0; i < 64 * 64; i++) {
+		texels_layer[i][0] = bsdf_split_sum_ggx[i*2 + 0];
+		texels_layer[i][1] = bsdf_split_sum_ggx[i*2 + 1];
+		texels_layer[i][2] = ltc_mag_ggx[i];
+	}
+	texels_layer += 64 * 64;
+
+	/* Copy blue noise in 3rd layer  */
+	for (int i = 0; i < 64 * 64; i++) {
+		float noise;
+		noise = blue_noise[i][0] + offset;
+		noise = noise - floorf(noise); /* fract */
+		texels_layer[i][0] = noise;
+
+		noise = blue_noise[i][1] + offset;
+		noise = noise - floorf(noise); /* fract */
+		texels_layer[i][1] = noise * 0.5 + 0.5;
+		texels_layer[i][2] = cosf(noise * 2.0 * M_PI);
+		texels_layer[i][3] = sinf(noise * 2.0 * M_PI);
+	}
+	texels_layer += 64 * 64;
+
+	/* Copy Refraction GGX LUT in layer 4 - 20 */
+	for (int j = 0; j < 16; ++j) {
+		for (int i = 0; i < 64 * 64; i++) {
+			texels_layer[i][0] = btdf_split_sum_ggx[j*2][i];
+			texels_layer[i][1] = btdf_split_sum_ggx[j*2][i];
+			texels_layer[i][2] = btdf_split_sum_ggx[j*2][i];
+			texels_layer[i][3] = btdf_split_sum_ggx[j*2][i];
+		}
+		texels_layer += 64 * 64;
+	}
+
+	e_data.util_tex = DRW_texture_create_2D_array(64, 64, layers, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_WRAP, (float *)texels);
+	MEM_freeN(texels);
+}
+
 void EEVEE_materials_init(EEVEE_StorageList *stl)
 {
 	if (!e_data.frag_shader_lib) {
@@ -466,43 +521,7 @@ void EEVEE_materials_init(EEVEE_StorageList *stl)
 
 		MEM_freeN(frag_str);
 
-		/* Textures */
-		const int layers = 3 + 16;
-		float (*texels)[4] = MEM_mallocN(sizeof(float[4]) * 64 * 64 * layers, "utils texels");
-		float (*texels_layer)[4] = texels;
-
-		/* Copy ltc_mat_ggx into 1st layer */
-		memcpy(texels_layer, ltc_mat_ggx, sizeof(float[4]) * 64 * 64);
-		texels_layer += 64 * 64;
-
-		/* Copy bsdf_split_sum_ggx into 2nd layer red and green channels.
-		   Copy ltc_mag_ggx into 2nd layer blue channel. */
-		for (int i = 0; i < 64 * 64; i++) {
-			texels_layer[i][0] = bsdf_split_sum_ggx[i*2 + 0];
-			texels_layer[i][1] = bsdf_split_sum_ggx[i*2 + 1];
-			texels_layer[i][2] = ltc_mag_ggx[i];
-		}
-		texels_layer += 64 * 64;
-
-		for (int i = 0; i < 64 * 64; i++) {
-			texels_layer[i][0] = blue_noise[i][0];
-			texels_layer[i][1] = blue_noise[i][1] * 0.5 + 0.5;
-			texels_layer[i][2] = cosf(blue_noise[i][1] * 2.0 * M_PI);
-			texels_layer[i][3] = sinf(blue_noise[i][1] * 2.0 * M_PI);
-		}
-
-		for (int j = 0; j < 16; ++j) {
-			texels_layer += 64 * 64;
-			for (int i = 0; i < 64 * 64; i++) {
-				texels_layer[i][0] = btdf_split_sum_ggx[j*2][i];
-				texels_layer[i][1] = btdf_split_sum_ggx[j*2][i];
-				texels_layer[i][2] = btdf_split_sum_ggx[j*2][i];
-				texels_layer[i][3] = btdf_split_sum_ggx[j*2][i];
-			}
-		}
-
-		e_data.util_tex = DRW_texture_create_2D_array(64, 64, layers, DRW_TEX_RGBA_16, DRW_TEX_FILTER | DRW_TEX_WRAP, (float *)texels);
-		MEM_freeN(texels);
+		EEVEE_update_util_texture(0.0f);
 	}
 
 	{
diff --git a/source/blender/draw/engines/eevee/eevee_private.h b/source/blender/draw/engines/eevee/eevee_private.h
index 1f1a4ef0fcf..723b7789377 100644
--- a/source/blender/draw/engines/eevee/eevee_private.h
+++ b/source/blender/draw/engines/eevee/eevee_private.h
@@ -522,6 +522,7 @@ struct GPUMaterial *EEVEE_material_mesh_depth_get(struct Scene *scene, Material
 struct GPUMaterial *EEVEE_material_hair_get(struct Scene *scene, Material *ma);
 void EEVEE_materials_free(void);
 void EEVEE_draw_default_passes(EEVEE_PassList *psl);
+void EEVEE_update_util_texture(float offset);
 
 /* eevee_lights.c */
 void EEVEE_lights_init(EEVEE_SceneLayerData *sldata);
diff --git a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
index e346009bba8..2202ee605fc 100644
--- a/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
+++ b/source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl
@@ -23,7 +23,7 @@ uniform ivec2 aoHorizonTexSize;
 #define aoFactor     aoParameters[0].z
 #define aoInvSamples aoParameters[0].w
 
-#define aoOffset     aoParameters[1].x
+#define aoOffset     aoParameters[1].x /* UNUSED */
 #define aoBounceFac  aoParameters[1].y
 #define aoQuality    aoParameters[1].z
 #define aoSettings   aoParameters[1].w
@@ -76,8 +76,6 @@ float get_phi(ivec2 hr_co, ivec2 fs_co, float sample)
 	}
 	/* Blue noise is scaled to cover the rest of the range. */
 	phi += aoInvSamples * blue_noise;
-	/* Rotate everything (for multisampling) */
-	phi += aoOffset;
 	phi *= M_PI;
 
 	return phi;
@@ -91,7 +89,6 @@ float get_offset(ivec2 fs_co, float sample)
 	/* Interleaved jitter for spatial 2x2 denoising */
 	offset += 0.25 * dot(vec2(1.0), vec2(fs_co & 1));
 	offset += texture(utilTex, vec3((vec2(fs_co / 2) + 0.5 + 16.0) / LUT_SIZE, 2.0)).r;
-	offset = fract(offset + aoOffset);
 	return offset;
 }
 
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 7dc047882c3..0a958404385 100644
--- a/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
+++ b/source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl
@@ -16,6 +16,7 @@ uniform sampler2D normalBuffer;
 uniform sampler2D specroughBuffer;
 
 uniform int planar_count;
+uniform float noiseOffset;
 
 layout(location = 0) out vec4 hitData0;
 layout(location = 1) out vec4 hitData1;



More information about the Bf-blender-cvs mailing list