diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-02-03 02:00:19 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-02-03 04:19:10 +0300 |
commit | 36b259fa889afebce390f98862ea243e617aa989 (patch) | |
tree | b8c5710da7207276052a3fcff65864e2f9f2ad1b /source/blender/draw/engines/eevee/eevee_render.c | |
parent | 39706a0a3df552b2d6759cc12c07b6af59269649 (diff) |
Eevee: Render: Add ambient occlusion pass support.
Diffstat (limited to 'source/blender/draw/engines/eevee/eevee_render.c')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_render.c | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 51e8fa241d0..68d575df11c 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -318,6 +318,35 @@ static void eevee_render_result_mist( } } +static void eevee_render_result_occlusion( + RenderResult *rr, const char *viewname, + EEVEE_Data *vedata, EEVEE_ViewLayerData *UNUSED(sldata)) +{ + const DRWContextState *draw_ctx = DRW_context_state_get(); + ViewLayer *view_layer = draw_ctx->view_layer; + + if (vedata->fbl->ao_accum_fb == NULL) { + /* AO is not enabled. */ + return; + } + + if ((view_layer->passflag & SCE_PASS_AO) != 0) { + RenderLayer *rl = rr->layers.first; + RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_AO, viewname); + + IDProperty *props = BKE_view_layer_engine_evaluated_get(view_layer, COLLECTION_MODE_NONE, RE_engine_id_BLENDER_EEVEE); + float render_samples = (float)BKE_collection_engine_property_value_get_int(props, "taa_render_samples"); + + DRW_framebuffer_bind(vedata->fbl->ao_accum_fb); + DRW_framebuffer_read_data(rr->xof, rr->yof, rr->rectx, rr->recty, 3, 0, rp->rect); + + /* This is the accumulated color. Divide by the number of samples. */ + for (int i = 0; i < rr->rectx * rr->recty * 3; i += 3) { + rp->rect[i] = rp->rect[i+1] = rp->rect[i+2] = min_ff(1.0f, rp->rect[i] / render_samples); + } + } +} + static void eevee_render_draw_background(EEVEE_Data *vedata) { EEVEE_TextureList *txl = vedata->txl; @@ -373,6 +402,10 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct D EEVEE_mist_output_init(sldata, vedata); } + if ((view_layer->passflag & SCE_PASS_AO) != 0) { + EEVEE_occlusion_output_init(sldata, vedata); + } + /* Init render result. */ const char *viewname = RE_GetActiveRenderView(engine->re); const float *render_size = DRW_viewport_size_get(); @@ -431,7 +464,10 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct D DRW_draw_pass(psl->refract_depth_pass); DRW_draw_pass(psl->refract_depth_pass_cull); DRW_draw_pass(psl->refract_pass); + /* Subsurface output */ EEVEE_subsurface_output_accumulate(sldata, vedata); + /* Occlusion output */ + EEVEE_occlusion_output_accumulate(sldata, vedata); /* Result NORMAL */ eevee_render_result_normal(rr, viewname, vedata, sldata); /* Volumetrics Resolve Opaque */ @@ -450,6 +486,7 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *engine, struct D eevee_render_result_combined(rr, viewname, vedata, sldata); eevee_render_result_subsurface(rr, viewname, vedata, sldata); eevee_render_result_mist(rr, viewname, vedata, sldata); + eevee_render_result_occlusion(rr, viewname, vedata, sldata); RE_engine_end_result(engine, rr, false, false, false); } @@ -471,6 +508,7 @@ void EEVEE_render_update_passes(RenderEngine *engine, Scene *scene, ViewLayer *v CHECK_PASS(Z, 1, "Z"); CHECK_PASS(MIST, 1, "Z"); CHECK_PASS(NORMAL, 3, "XYZ"); + CHECK_PASS(AO, 3, "RGB"); CHECK_PASS(SUBSURFACE_COLOR, 3, "RGB"); CHECK_PASS(SUBSURFACE_DIRECT, 3, "RGB"); |