Eevee: Add support for TAA/SuperSampling for final render.

This commit is contained in:
Clément Foucault 2018-01-29 19:39:53 +01:00
parent 8cce339131
commit f107af3519
3 changed files with 31 additions and 13 deletions

View File

@ -834,6 +834,8 @@ void EEVEE_motion_blur_free(void);
/* eevee_temporal_sampling.c */
int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_temporal_sampling_matrices_calc(
EEVEE_EffectsInfo *effects, float viewmat[4][4], float persmat[4][4], double ht_point[2]);
void EEVEE_temporal_sampling_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata);
void EEVEE_temporal_sampling_draw(EEVEE_Data *vedata);
void EEVEE_temporal_sampling_free(void);

View File

@ -163,7 +163,12 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *UNUSED(engine),
EEVEE_lights_cache_finish(sldata);
EEVEE_lightprobes_cache_finish(sldata, vedata);
{
const DRWContextState *draw_ctx = DRW_context_state_get();
ViewLayer *view_layer = draw_ctx->view_layer;
IDProperty *props = BKE_view_layer_engine_evaluated_get(view_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE);
unsigned int render_samples = BKE_collection_engine_property_value_get_int(props, "taa_render_samples");
while (render_samples-- > 0) {
float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.6f};
unsigned int primes[3] = {2, 3, 7};
double offset[3] = {0.0, 0.0, 0.0};
@ -171,16 +176,17 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *UNUSED(engine),
BLI_halton_3D(primes, offset, stl->effects->taa_current_sample, r);
EEVEE_update_noise(psl, fbl, r);
EEVEE_temporal_sampling_matrices_calc(stl->effects, g_data->viewmat, g_data->persmat, r);
/* Refresh Probes & shadows */
EEVEE_lightprobes_refresh(sldata, vedata);
DRW_uniformbuffer_update(sldata->common_ubo, &sldata->common_data);
EEVEE_draw_shadows(sldata, psl);
DRW_viewport_matrix_override_set(g_data->persmat, DRW_MAT_PERS);
DRW_viewport_matrix_override_set(g_data->persinv, DRW_MAT_PERSINV);
DRW_viewport_matrix_override_set(g_data->winmat, DRW_MAT_WIN);
DRW_viewport_matrix_override_set(g_data->wininv, DRW_MAT_WININV);
DRW_viewport_matrix_override_set(stl->effects->overide_persmat, DRW_MAT_PERS);
DRW_viewport_matrix_override_set(stl->effects->overide_persinv, DRW_MAT_PERSINV);
DRW_viewport_matrix_override_set(stl->effects->overide_winmat, DRW_MAT_WIN);
DRW_viewport_matrix_override_set(stl->effects->overide_wininv, DRW_MAT_WININV);
DRW_viewport_matrix_override_set(g_data->viewmat, DRW_MAT_VIEW);
DRW_viewport_matrix_override_set(g_data->viewinv, DRW_MAT_VIEWINV);

View File

@ -44,6 +44,23 @@ static void eevee_create_shader_temporal_sampling(void)
e_data.taa_resolve_sh = DRW_shader_create_fullscreen(datatoc_effect_temporal_aa_glsl, NULL);
}
void EEVEE_temporal_sampling_matrices_calc(
EEVEE_EffectsInfo *effects, float viewmat[4][4], float persmat[4][4], double ht_point[2])
{
const float *viewport_size = DRW_viewport_size_get();
/* TODO Blackman-Harris filter */
window_translate_m4(
effects->overide_winmat, persmat,
((float)(ht_point[0]) * 2.0f - 1.0f) / viewport_size[0],
((float)(ht_point[1]) * 2.0f - 1.0f) / viewport_size[1]);
mul_m4_m4m4(effects->overide_persmat, effects->overide_winmat, viewmat);
invert_m4_m4(effects->overide_persinv, effects->overide_persmat);
invert_m4_m4(effects->overide_wininv, effects->overide_winmat);
}
int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata)
{
EEVEE_StorageList *stl = vedata->stl;
@ -110,14 +127,7 @@ int EEVEE_temporal_sampling_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data
BLI_halton_2D(ht_primes, ht_offset, effects->taa_current_sample - 1, ht_point);
window_translate_m4(
effects->overide_winmat, persmat,
((float)(ht_point[0]) * 2.0f - 1.0f) / viewport_size[0],
((float)(ht_point[1]) * 2.0f - 1.0f) / viewport_size[1]);
mul_m4_m4m4(effects->overide_persmat, effects->overide_winmat, viewmat);
invert_m4_m4(effects->overide_persinv, effects->overide_persmat);
invert_m4_m4(effects->overide_wininv, effects->overide_winmat);
EEVEE_temporal_sampling_matrices_calc(effects, viewmat, persmat, ht_point);
DRW_viewport_matrix_override_set(effects->overide_persmat, DRW_MAT_PERS);
DRW_viewport_matrix_override_set(effects->overide_persinv, DRW_MAT_PERSINV);