diff options
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; |