Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_occlusion.c
| Show First 20 Lines • Show All 72 Lines • ▼ Show 20 Lines | int EEVEE_occlusion_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); | const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); | ||||
| if (!e_data.dummy_horizon_tx) { | if (!e_data.dummy_horizon_tx) { | ||||
| const float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | const float pixel[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | ||||
| e_data.dummy_horizon_tx = DRW_texture_create_2d(1, 1, GPU_RGBA8, DRW_TEX_WRAP, pixel); | e_data.dummy_horizon_tx = DRW_texture_create_2d(1, 1, GPU_RGBA8, DRW_TEX_WRAP, pixel); | ||||
| } | } | ||||
| if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED) { | if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED || | ||||
| stl->g_data->render_passes & EEVEE_RENDER_PASS_AO) { | |||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_size_get(); | ||||
| const int fs_size[2] = {(int)viewport_size[0], (int)viewport_size[1]}; | const int fs_size[2] = {(int)viewport_size[0], (int)viewport_size[1]}; | ||||
| /* Shaders */ | /* Shaders */ | ||||
| if (!e_data.gtao_sh) { | if (!e_data.gtao_sh) { | ||||
| eevee_create_shader_occlusion(); | eevee_create_shader_occlusion(); | ||||
| } | } | ||||
| common_data->ao_dist = scene_eval->eevee.gtao_distance; | common_data->ao_dist = scene_eval->eevee.gtao_distance; | ||||
| common_data->ao_factor = scene_eval->eevee.gtao_factor; | common_data->ao_factor = scene_eval->eevee.gtao_factor; | ||||
| common_data->ao_quality = 1.0f - scene_eval->eevee.gtao_quality; | common_data->ao_quality = 1.0f - scene_eval->eevee.gtao_quality; | ||||
| common_data->ao_settings = 1.0f; /* USE_AO */ | common_data->ao_settings = 1.0f; /* USE_AO */ | ||||
| if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BENT_NORMALS) { | if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BENT_NORMALS) { | ||||
| common_data->ao_settings += 2.0f; /* USE_BENT_NORMAL */ | common_data->ao_settings += 2.0f; /* USE_BENT_NORMAL */ | ||||
| } | } | ||||
| if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) { | if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) { | ||||
| common_data->ao_settings += 4.0f; /* USE_DENOISE */ | common_data->ao_settings += 4.0f; /* USE_DENOISE */ | ||||
| } | } | ||||
| common_data->ao_bounce_fac = (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) ? 1.0f : 0.0f; | common_data->ao_bounce_fac = (scene_eval->eevee.flag & SCE_EEVEE_GTAO_BOUNCE) ? 1.0f : 0.0f; | ||||
| effects->gtao_horizons = DRW_texture_pool_query_2d( | effects->gtao_horizons_renderpass = DRW_texture_pool_query_2d( | ||||
| fs_size[0], fs_size[1], GPU_RGBA8, &draw_engine_eevee_type); | fs_size[0], fs_size[1], GPU_RGBA8, &draw_engine_eevee_type); | ||||
| GPU_framebuffer_ensure_config( | GPU_framebuffer_ensure_config( | ||||
| &fbl->gtao_fb, {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons)}); | &fbl->gtao_fb, | ||||
| {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons_renderpass)}); | |||||
| if (G.debug_value == 6) { | if (G.debug_value == 6) { | ||||
| effects->gtao_horizons_debug = DRW_texture_pool_query_2d( | effects->gtao_horizons_debug = DRW_texture_pool_query_2d( | ||||
| fs_size[0], fs_size[1], GPU_RGBA8, &draw_engine_eevee_type); | fs_size[0], fs_size[1], GPU_RGBA8, &draw_engine_eevee_type); | ||||
| GPU_framebuffer_ensure_config( | GPU_framebuffer_ensure_config( | ||||
| &fbl->gtao_debug_fb, | &fbl->gtao_debug_fb, | ||||
| {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons_debug)}); | {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(effects->gtao_horizons_debug)}); | ||||
| } | } | ||||
| else { | else { | ||||
| effects->gtao_horizons_debug = NULL; | effects->gtao_horizons_debug = NULL; | ||||
| } | } | ||||
| effects->gtao_horizons = (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED) ? | |||||
fclem: I prefer that `gtao_horizons` remain the one for the surface and that… | |||||
| effects->gtao_horizons_renderpass : | |||||
| e_data.dummy_horizon_tx; | |||||
| return EFFECT_GTAO | EFFECT_NORMAL_BUFFER; | return EFFECT_GTAO | EFFECT_NORMAL_BUFFER; | ||||
| } | } | ||||
| /* Cleanup */ | /* Cleanup */ | ||||
| effects->gtao_horizons_renderpass = e_data.dummy_horizon_tx; | |||||
| effects->gtao_horizons = e_data.dummy_horizon_tx; | effects->gtao_horizons = e_data.dummy_horizon_tx; | ||||
| GPU_FRAMEBUFFER_FREE_SAFE(fbl->gtao_fb); | GPU_FRAMEBUFFER_FREE_SAFE(fbl->gtao_fb); | ||||
| common_data->ao_settings = 0.0f; | common_data->ao_settings = 0.0f; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples) | void EEVEE_occlusion_output_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata, uint tot_samples) | ||||
| { | { | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | |||||
| const Scene *scene_eval = DEG_get_evaluated_scene(draw_ctx->depsgraph); | |||||
| if (scene_eval->eevee.flag & SCE_EEVEE_GTAO_ENABLED) { | |||||
| const eGPUTextureFormat texture_format = (tot_samples > 128) ? GPU_R32F : GPU_R16F; | const eGPUTextureFormat texture_format = (tot_samples > 128) ? GPU_R32F : GPU_R16F; | ||||
| DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | ||||
| const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | ||||
| /* Should be enough precision for many samples. */ | /* Should be enough precision for many samples. */ | ||||
| DRW_texture_ensure_fullscreen_2d(&txl->ao_accum, texture_format, 0); | DRW_texture_ensure_fullscreen_2d(&txl->ao_accum, texture_format, 0); | ||||
| GPU_framebuffer_ensure_config(&fbl->ao_accum_fb, | GPU_framebuffer_ensure_config(&fbl->ao_accum_fb, | ||||
| {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->ao_accum)}); | {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->ao_accum)}); | ||||
| /* Clear texture. */ | /* Clear texture. */ | ||||
| if (effects->taa_current_sample == 1) { | if (effects->taa_current_sample == 1) { | ||||
| GPU_framebuffer_bind(fbl->ao_accum_fb); | GPU_framebuffer_bind(fbl->ao_accum_fb); | ||||
| GPU_framebuffer_clear_color(fbl->ao_accum_fb, clear); | GPU_framebuffer_clear_color(fbl->ao_accum_fb, clear); | ||||
| } | } | ||||
| /* Clear texture. */ | |||||
| if (DRW_state_is_image_render() || effects->taa_current_sample == 1) { | |||||
| GPU_framebuffer_bind(fbl->ao_accum_fb); | |||||
| GPU_framebuffer_clear_color(fbl->ao_accum_fb, clear); | |||||
| } | |||||
| /* Accumulation pass */ | /* Accumulation pass */ | ||||
| DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD; | DRWState state = DRW_STATE_WRITE_COLOR | DRW_STATE_BLEND_ADD; | ||||
| DRW_PASS_CREATE(psl->ao_accum_ps, state); | DRW_PASS_CREATE(psl->ao_accum_ps, state); | ||||
| DRWShadingGroup *grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_accum_ps); | DRWShadingGroup *grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_accum_ps); | ||||
| DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); | DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); | DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input); | DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); | DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons_renderpass); | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); | DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); | ||||
| DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | ||||
| } | } | ||||
| else { | |||||
| /* Cleanup to release memory */ | |||||
| DRW_TEXTURE_FREE_SAFE(txl->ao_accum); | |||||
| GPU_FRAMEBUFFER_FREE_SAFE(fbl->ao_accum_fb); | |||||
| } | |||||
| } | |||||
| void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | void EEVEE_occlusion_cache_init(EEVEE_ViewLayerData *sldata, EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); | ||||
| Show All 33 Lines | if ((effects->enabled_effects & EFFECT_GTAO) != 0) { | ||||
| if (G.debug_value == 6) { | if (G.debug_value == 6) { | ||||
| DRW_PASS_CREATE(psl->ao_horizon_debug, DRW_STATE_WRITE_COLOR); | DRW_PASS_CREATE(psl->ao_horizon_debug, DRW_STATE_WRITE_COLOR); | ||||
| grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_horizon_debug); | grp = DRW_shgroup_create(e_data.gtao_debug_sh, psl->ao_horizon_debug); | ||||
| DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); | DRW_shgroup_uniform_texture(grp, "utilTex", EEVEE_materials_get_util_tex()); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); | DRW_shgroup_uniform_texture_ref(grp, "maxzBuffer", &txl->maxzbuffer); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input); | DRW_shgroup_uniform_texture_ref(grp, "normalBuffer", &effects->ssr_normal_input); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons); | DRW_shgroup_uniform_texture_ref(grp, "horizonBuffer", &effects->gtao_horizons_renderpass); | ||||
| DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | DRW_shgroup_uniform_block(grp, "common_block", sldata->common_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); | DRW_shgroup_uniform_block(grp, "renderpass_block", sldata->renderpass_ubo.combined); | ||||
| DRW_shgroup_call(grp, quad, NULL); | DRW_shgroup_call(grp, quad, NULL); | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_occlusion_compute(EEVEE_ViewLayerData *UNUSED(sldata), | void EEVEE_occlusion_compute(EEVEE_ViewLayerData *UNUSED(sldata), | ||||
| ▲ Show 20 Lines • Show All 83 Lines • Show Last 20 Lines | |||||
I prefer that gtao_horizons remain the one for the surface and that gtao_horizons_renderpass is used for the other. This is a bit more clear which is which.