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).
This commit is contained in:
Clément Foucault 2017-08-21 01:38:14 +02:00
parent 1b79d323d9
commit d007828ae7
6 changed files with 62 additions and 45 deletions

View File

@ -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]);

View File

@ -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--) {

View File

@ -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);
}
{

View File

@ -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);

View File

@ -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;
}

View File

@ -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;