Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/workbench/workbench_effect_taa.c
| Show First 20 Lines • Show All 164 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx) | DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx) | ||||
| { | { | ||||
| WORKBENCH_StorageList *stl = vedata->stl; | WORKBENCH_StorageList *stl = vedata->stl; | ||||
| WORKBENCH_TextureList *txl = vedata->txl; | WORKBENCH_TextureList *txl = vedata->txl; | ||||
| WORKBENCH_EffectInfo *effect_info = stl->effects; | WORKBENCH_EffectInfo *effect_info = stl->effects; | ||||
| WORKBENCH_FramebufferList *fbl = vedata->fbl; | WORKBENCH_FramebufferList *fbl = vedata->fbl; | ||||
| WORKBENCH_PrivateData *wpd = stl->g_data; | |||||
| /* | |||||
| * jitter_index is not updated yet. This will be done in during draw phase. | |||||
| * so for now it is inversed. | |||||
| */ | |||||
| int previous_jitter_index = effect_info->jitter_index; | |||||
| { | { | ||||
| const eGPUTextureFormat hist_buffer_format = DRW_state_is_image_render() ? GPU_RGBA16F : | const eGPUTextureFormat hist_buffer_format = DRW_state_is_image_render() ? GPU_RGBA16F : | ||||
| GPU_RGBA8; | GPU_RGBA8; | ||||
| DRW_texture_ensure_fullscreen_2d(&txl->history_buffer_tx, hist_buffer_format, 0); | DRW_texture_ensure_fullscreen_2d(&txl->history_buffer_tx, hist_buffer_format, 0); | ||||
| DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0); | DRW_texture_ensure_fullscreen_2d(&txl->depth_buffer_tx, GPU_DEPTH24_STENCIL8, 0); | ||||
| } | } | ||||
| Show All 11 Lines | DRWPass *workbench_taa_create_pass(WORKBENCH_Data *vedata, GPUTexture **color_buffer_tx) | ||||
| DRWPass *pass = DRW_pass_create("Effect TAA", DRW_STATE_WRITE_COLOR); | DRWPass *pass = DRW_pass_create("Effect TAA", DRW_STATE_WRITE_COLOR); | ||||
| DRWShadingGroup *grp = DRW_shgroup_create(e_data.effect_taa_sh, pass); | DRWShadingGroup *grp = DRW_shgroup_create(e_data.effect_taa_sh, pass); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", color_buffer_tx); | DRW_shgroup_uniform_texture_ref(grp, "colorBuffer", color_buffer_tx); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "historyBuffer", &txl->history_buffer_tx); | DRW_shgroup_uniform_texture_ref(grp, "historyBuffer", &txl->history_buffer_tx); | ||||
| DRW_shgroup_uniform_float(grp, "mixFactor", &effect_info->taa_mix_factor, 1); | DRW_shgroup_uniform_float(grp, "mixFactor", &effect_info->taa_mix_factor, 1); | ||||
| DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | ||||
| /* | |||||
| * Set the offset for the cavity shader so every iteration different | |||||
| * samples will be selected | |||||
| */ | |||||
| wpd->ssao_params[3] = previous_jitter_index; | |||||
| return pass; | return pass; | ||||
| } | } | ||||
| void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata) | void workbench_taa_draw_scene_start(WORKBENCH_Data *vedata) | ||||
| { | { | ||||
| WORKBENCH_StorageList *stl = vedata->stl; | WORKBENCH_StorageList *stl = vedata->stl; | ||||
| WORKBENCH_EffectInfo *effect_info = stl->effects; | WORKBENCH_EffectInfo *effect_info = stl->effects; | ||||
| WORKBENCH_PrivateData *wpd = stl->g_data; | |||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_size_get(); | ||||
| const DRWView *default_view = DRW_view_default_get(); | const DRWView *default_view = DRW_view_default_get(); | ||||
| int num_samples = 8; | int num_samples = 8; | ||||
| float(*samples)[2]; | float(*samples)[2]; | ||||
| num_samples = workbench_taa_calculate_num_iterations(vedata); | num_samples = workbench_taa_calculate_num_iterations(vedata); | ||||
| switch (num_samples) { | switch (num_samples) { | ||||
| default: | default: | ||||
| Show All 13 Lines | case 32: | ||||
| samples = e_data.jitter_32; | samples = e_data.jitter_32; | ||||
| break; | break; | ||||
| } | } | ||||
| const int jitter_index = effect_info->jitter_index; | const int jitter_index = effect_info->jitter_index; | ||||
| const float *transform_offset = samples[jitter_index]; | const float *transform_offset = samples[jitter_index]; | ||||
| effect_info->taa_mix_factor = 1.0f / (jitter_index + 1); | effect_info->taa_mix_factor = 1.0f / (jitter_index + 1); | ||||
| effect_info->jitter_index = (jitter_index + 1) % num_samples; | effect_info->jitter_index = (jitter_index + 1) % num_samples; | ||||
| /* Copy jitter index to Cavity iteration */ | |||||
| wpd->ssao_params[3] = effect_info->jitter_index; | |||||
| /* construct new matrices from transform delta */ | /* construct new matrices from transform delta */ | ||||
| float winmat[4][4], viewmat[4][4], persmat[4][4]; | float winmat[4][4], viewmat[4][4], persmat[4][4]; | ||||
| DRW_view_winmat_get(default_view, winmat, false); | DRW_view_winmat_get(default_view, winmat, false); | ||||
| DRW_view_viewmat_get(default_view, viewmat, false); | DRW_view_viewmat_get(default_view, viewmat, false); | ||||
| DRW_view_persmat_get(default_view, persmat, false); | DRW_view_persmat_get(default_view, persmat, false); | ||||
| window_translate_m4(winmat, | window_translate_m4(winmat, | ||||
| ▲ Show 20 Lines • Show All 58 Lines • Show Last 20 Lines | |||||