Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2017-08-21 02:38:14 +0300
committerClément Foucault <foucault.clem@gmail.com>2017-08-21 02:39:23 +0300
commitd007828ae78d66cdcc005d9ba3ad57e987f0190a (patch)
treefb4b016b334de11dc309fec438fb76d3143bde78
parent1b79d323d95567de4be595409b5994d993d5154b (diff)
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).
-rw-r--r--source/blender/draw/engines/eevee/eevee_effects.c1
-rw-r--r--source/blender/draw/engines/eevee/eevee_engine.c6
-rw-r--r--source/blender/draw/engines/eevee/eevee_materials.c93
-rw-r--r--source/blender/draw/engines/eevee/eevee_private.h1
-rw-r--r--source/blender/draw/engines/eevee/shaders/ambient_occlusion_lib.glsl5
-rw-r--r--source/blender/draw/engines/eevee/shaders/effect_ssr_frag.glsl1
6 files changed, 62 insertions, 45 deletions
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;