Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/engines/eevee/eevee_subsurface.c
| Show All 38 Lines | |||||
| extern char datatoc_effect_subsurface_frag_glsl[]; | extern char datatoc_effect_subsurface_frag_glsl[]; | ||||
| static void eevee_create_shader_subsurface(void) | static void eevee_create_shader_subsurface(void) | ||||
| { | { | ||||
| e_data.sss_sh[0] = DRW_shader_create_fullscreen(datatoc_effect_subsurface_frag_glsl, "#define FIRST_PASS\n"); | e_data.sss_sh[0] = DRW_shader_create_fullscreen(datatoc_effect_subsurface_frag_glsl, "#define FIRST_PASS\n"); | ||||
| e_data.sss_sh[1] = DRW_shader_create_fullscreen(datatoc_effect_subsurface_frag_glsl, "#define SECOND_PASS\n"); | e_data.sss_sh[1] = DRW_shader_create_fullscreen(datatoc_effect_subsurface_frag_glsl, "#define SECOND_PASS\n"); | ||||
| } | } | ||||
| int EEVEE_subsurface_init(EEVEE_SceneLayerData *UNUSED(sldata), EEVEE_Data *vedata) | int EEVEE_subsurface_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| const float *viewport_size = DRW_viewport_size_get(); | const float *viewport_size = DRW_viewport_size_get(); | ||||
| const DRWContextState *draw_ctx = DRW_context_state_get(); | const DRWContextState *draw_ctx = DRW_context_state_get(); | ||||
| SceneLayer *scene_layer = draw_ctx->scene_layer; | ViewLayer *view_layer = draw_ctx->view_layer; | ||||
| IDProperty *props = BKE_scene_layer_engine_evaluated_get(scene_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); | IDProperty *props = BKE_view_layer_engine_evaluated_get(view_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); | ||||
| if (BKE_collection_engine_property_value_get_bool(props, "sss_enable")) { | if (BKE_collection_engine_property_value_get_bool(props, "sss_enable")) { | ||||
| effects->sss_sample_count = 1 + BKE_collection_engine_property_value_get_int(props, "sss_samples") * 2; | effects->sss_sample_count = 1 + BKE_collection_engine_property_value_get_int(props, "sss_samples") * 2; | ||||
| effects->sss_jitter_threshold = BKE_collection_engine_property_value_get_float(props, "sss_jitter_threshold"); | effects->sss_jitter_threshold = BKE_collection_engine_property_value_get_float(props, "sss_jitter_threshold"); | ||||
| /* Shaders */ | /* Shaders */ | ||||
| if (!e_data.sss_sh[0]) { | if (!e_data.sss_sh[0]) { | ||||
| eevee_create_shader_subsurface(); | eevee_create_shader_subsurface(); | ||||
| Show All 21 Lines | int EEVEE_subsurface_init(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| DRW_TEXTURE_FREE_SAFE(txl->sss_blur); | DRW_TEXTURE_FREE_SAFE(txl->sss_blur); | ||||
| DRW_TEXTURE_FREE_SAFE(txl->sss_stencil); | DRW_TEXTURE_FREE_SAFE(txl->sss_stencil); | ||||
| DRW_FRAMEBUFFER_FREE_SAFE(fbl->sss_blur_fb); | DRW_FRAMEBUFFER_FREE_SAFE(fbl->sss_blur_fb); | ||||
| DRW_FRAMEBUFFER_FREE_SAFE(fbl->sss_clear_fb); | DRW_FRAMEBUFFER_FREE_SAFE(fbl->sss_clear_fb); | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| void EEVEE_subsurface_cache_init(EEVEE_SceneLayerData *UNUSED(sldata), EEVEE_Data *vedata) | void EEVEE_subsurface_cache_init(EEVEE_ViewLayerData *UNUSED(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_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| if ((effects->enabled_effects & EFFECT_SSS) != 0) { | if ((effects->enabled_effects & EFFECT_SSS) != 0) { | ||||
| /** Screen Space SubSurface Scattering overview | /** Screen Space SubSurface Scattering overview | ||||
| * TODO | * TODO | ||||
| Show All 29 Lines | void EEVEE_subsurface_add_pass(EEVEE_Data *vedata, unsigned int sss_id, struct GPUUniformBuffer *sss_profile) | ||||
| DRW_shgroup_uniform_buffer(grp, "depthBuffer", &dtxl->depth); | DRW_shgroup_uniform_buffer(grp, "depthBuffer", &dtxl->depth); | ||||
| DRW_shgroup_uniform_buffer(grp, "sssData", &txl->sss_blur); | DRW_shgroup_uniform_buffer(grp, "sssData", &txl->sss_blur); | ||||
| DRW_shgroup_uniform_block(grp, "sssProfile", sss_profile); | DRW_shgroup_uniform_block(grp, "sssProfile", sss_profile); | ||||
| DRW_shgroup_uniform_float(grp, "jitterThreshold", &effects->sss_jitter_threshold, 1); | DRW_shgroup_uniform_float(grp, "jitterThreshold", &effects->sss_jitter_threshold, 1); | ||||
| DRW_shgroup_stencil_mask(grp, sss_id); | DRW_shgroup_stencil_mask(grp, sss_id); | ||||
| DRW_shgroup_call_add(grp, quad, NULL); | DRW_shgroup_call_add(grp, quad, NULL); | ||||
| } | } | ||||
| void EEVEE_subsurface_data_render(EEVEE_SceneLayerData *UNUSED(sldata), EEVEE_Data *vedata) | void EEVEE_subsurface_data_render(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| EEVEE_TextureList *txl = vedata->txl; | EEVEE_TextureList *txl = vedata->txl; | ||||
| EEVEE_FramebufferList *fbl = vedata->fbl; | EEVEE_FramebufferList *fbl = vedata->fbl; | ||||
| EEVEE_StorageList *stl = vedata->stl; | EEVEE_StorageList *stl = vedata->stl; | ||||
| EEVEE_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| if ((effects->enabled_effects & EFFECT_SSS) != 0) { | if ((effects->enabled_effects & EFFECT_SSS) != 0) { | ||||
| Show All 32 Lines | if ((effects->enabled_effects & EFFECT_SSS) != 0) { | ||||
| } | } | ||||
| if ((effects->enabled_effects & EFFECT_SSR) != 0) { | if ((effects->enabled_effects & EFFECT_SSR) != 0) { | ||||
| DRW_framebuffer_texture_attach(fbl->main, txl->ssr_specrough_input, 2, 0); | DRW_framebuffer_texture_attach(fbl->main, txl->ssr_specrough_input, 2, 0); | ||||
| } | } | ||||
| DRW_framebuffer_texture_attach(fbl->sss_clear_fb, txl->sss_data, 0, 0); | DRW_framebuffer_texture_attach(fbl->sss_clear_fb, txl->sss_data, 0, 0); | ||||
| } | } | ||||
| } | } | ||||
| void EEVEE_subsurface_compute(EEVEE_SceneLayerData *UNUSED(sldata), EEVEE_Data *vedata) | void EEVEE_subsurface_compute(EEVEE_ViewLayerData *UNUSED(sldata), EEVEE_Data *vedata) | ||||
| { | { | ||||
| EEVEE_PassList *psl = vedata->psl; | EEVEE_PassList *psl = vedata->psl; | ||||
| 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_EffectsInfo *effects = stl->effects; | EEVEE_EffectsInfo *effects = stl->effects; | ||||
| if ((effects->enabled_effects & EFFECT_SSS) != 0) { | if ((effects->enabled_effects & EFFECT_SSS) != 0) { | ||||
| Show All 35 Lines | |||||