Eevee: Add support for TAA/SuperSampling for final render.
This commit is contained in:
parent
8cce339131
commit
f107af3519
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue