Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_shadows.c
| Show First 20 Lines • Show All 355 Lines • ▼ Show 20 Lines | |||||
| void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata, | void EEVEE_shadow_output_init(EEVEE_ViewLayerData *sldata, | ||||
| EEVEE_Data *vedata, | EEVEE_Data *vedata, | ||||
| uint UNUSED(tot_samples)) | uint UNUSED(tot_samples)) | ||||
| { | { | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | |||||
| EEVEE_EffectsInfo *effects = stl->effects; | |||||
| 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}; | |||||
| /* Create FrameBuffer. */ | /* Create FrameBuffer. */ | ||||
| const eGPUTextureFormat texture_format = GPU_R32F; | const eGPUTextureFormat texture_format = GPU_R32F; | ||||
| DRW_texture_ensure_fullscreen_2d(&txl->shadow_accum, texture_format, 0); | DRW_texture_ensure_fullscreen_2d(&txl->shadow_accum, texture_format, 0); | ||||
| GPU_framebuffer_ensure_config(&fbl->shadow_accum_fb, | GPU_framebuffer_ensure_config(&fbl->shadow_accum_fb, | ||||
| {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->shadow_accum)}); | {GPU_ATTACHMENT_NONE, GPU_ATTACHMENT_TEXTURE(txl->shadow_accum)}); | ||||
| /* Clear texture. */ | |||||
| if (effects->taa_current_sample == 1) { | |||||
| GPU_framebuffer_bind(fbl->shadow_accum_fb); | |||||
| GPU_framebuffer_clear_color(fbl->shadow_accum_fb, clear); | |||||
| } | |||||
| /* Create Pass and shgroup. */ | /* Create Pass and shgroup. */ | ||||
| DRW_PASS_CREATE(psl->shadow_accum_pass, | DRW_PASS_CREATE(psl->shadow_accum_pass, | ||||
| DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_ALWAYS | DRW_STATE_BLEND_ADD_FULL); | DRW_STATE_WRITE_COLOR | DRW_STATE_DEPTH_ALWAYS | DRW_STATE_BLEND_ADD_FULL); | ||||
| DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_shadow_accum_sh_get(), | DRWShadingGroup *grp = DRW_shgroup_create(EEVEE_shaders_shadow_accum_sh_get(), | ||||
| psl->shadow_accum_pass); | psl->shadow_accum_pass); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_texture_ref(grp, "depthBuffer", &dtxl->depth); | ||||
| 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_block(grp, "probe_block", sldata->probe_ubo); | DRW_shgroup_uniform_block(grp, "probe_block", sldata->probe_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | DRW_shgroup_uniform_block(grp, "grid_block", sldata->grid_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); | DRW_shgroup_uniform_block(grp, "planar_block", sldata->planar_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); | DRW_shgroup_uniform_block(grp, "light_block", sldata->light_ubo); | ||||
| DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); | DRW_shgroup_uniform_block(grp, "shadow_block", sldata->shadow_ubo); | ||||
| 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_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool); | DRW_shgroup_uniform_texture_ref(grp, "shadowCubeTexture", &sldata->shadow_cube_pool); | ||||
| DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool); | DRW_shgroup_uniform_texture_ref(grp, "shadowCascadeTexture", &sldata->shadow_cascade_pool); | ||||
| DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | DRW_shgroup_call(grp, DRW_cache_fullscreen_quad_get(), NULL); | ||||
| } | } | ||||
| void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | void EEVEE_shadow_output_accumulate(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_EffectsInfo *effects = vedata->stl->effects; | |||||
| if (fbl->shadow_accum_fb != NULL) { | if (fbl->shadow_accum_fb != NULL) { | ||||
| GPU_framebuffer_bind(fbl->shadow_accum_fb); | GPU_framebuffer_bind(fbl->shadow_accum_fb); | ||||
| /* Clear texture. */ | |||||
| if (effects->taa_current_sample == 1) { | |||||
| const float clear[4] = {0.0f, 0.0f, 0.0f, 0.0f}; | |||||
| GPU_framebuffer_clear_color(fbl->shadow_accum_fb, clear); | |||||
| } | |||||
| DRW_draw_pass(psl->shadow_accum_pass); | DRW_draw_pass(psl->shadow_accum_pass); | ||||
| /* Restore */ | /* Restore */ | ||||
| GPU_framebuffer_bind(fbl->main_fb); | GPU_framebuffer_bind(fbl->main_fb); | ||||
| } | } | ||||
| } | } | ||||
| /** \} */ | /** \} */ | ||||