diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2018-01-29 23:59:34 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2018-01-30 00:00:15 +0300 |
commit | 376d42304b716da2f9bda8b55c539d39ac416281 (patch) | |
tree | b1ee8e832b10788527f30b72d478569e5e795b4f /source/blender/draw/engines | |
parent | 0f93d676176bb1dd7e74d032e7905f2d967e3ac8 (diff) |
Eevee: Add Z pass render result.
Diffstat (limited to 'source/blender/draw/engines')
-rw-r--r-- | source/blender/draw/engines/eevee/eevee_render.c | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/eevee_render.c b/source/blender/draw/engines/eevee/eevee_render.c index 54c20e661c4..a020887e420 100644 --- a/source/blender/draw/engines/eevee/eevee_render.c +++ b/source/blender/draw/engines/eevee/eevee_render.c @@ -228,11 +228,19 @@ void EEVEE_render_draw(EEVEE_Data *vedata, struct RenderEngine *UNUSED(engine), void EEVEE_render_output(EEVEE_Data *vedata, RenderEngine *engine, struct Depsgraph *UNUSED(depsgraph)) { + const DRWContextState *draw_ctx = DRW_context_state_get(); + ViewLayer *view_layer = draw_ctx->view_layer; + DefaultTextureList *dtxl = DRW_viewport_texture_list_get(); + EEVEE_ViewLayerData *sldata = EEVEE_view_layer_data_ensure(); + EEVEE_FramebufferList *fbl = vedata->fbl; EEVEE_StorageList *stl = vedata->stl; + EEVEE_PrivateData *g_data = stl->g_data; + EEVEE_CommonUniformBuffer *common_data = &sldata->common_data; const char *viewname = NULL; const float *render_size = DRW_viewport_size_get(); + /* Combined */ RenderResult *rr = RE_engine_begin_result(engine, 0, 0, (int)render_size[0], (int)render_size[1], NULL, viewname); RenderLayer *rl = rr->layers.first; RenderPass *rp = RE_pass_find_by_name(rl, RE_PASSNAME_COMBINED, viewname); @@ -240,5 +248,31 @@ void EEVEE_render_output(EEVEE_Data *vedata, RenderEngine *engine, struct Depsgr DRW_framebuffer_bind(stl->effects->final_fb); DRW_framebuffer_read_data(0, 0, (int)render_size[0], (int)render_size[1], 4, 0, rp->rect); + if (view_layer->passflag & SCE_PASS_Z) { + rp = RE_pass_find_by_name(rl, RE_PASSNAME_Z, viewname); + + DRW_framebuffer_texture_attach(fbl->main, dtxl->depth, 0, 0); + DRW_framebuffer_bind(fbl->main); + DRW_framebuffer_read_depth(0, 0, (int)render_size[0], (int)render_size[1], rp->rect); + + bool is_persp = DRW_viewport_is_persp_get(); + + /* Convert ogl depth [0..1] to view Z [near..far] */ + for (int i = 0; i < (int)render_size[0] * (int)render_size[1]; ++i) { + if (rp->rect[i] == 1.0f ) { + rp->rect[i] = 1e10f; /* Background */ + } + else { + if (is_persp) { + rp->rect[i] = rp->rect[i] * 2.0f - 1.0f; + rp->rect[i] = g_data->winmat[3][2] / (rp->rect[i] + g_data->winmat[2][2]); + } + else { + rp->rect[i] = -common_data->view_vecs[0][2] + rp->rect[i] * -common_data->view_vecs[1][2]; + } + } + } + } + RE_engine_end_result(engine, rr, false, false, false); }
\ No newline at end of file |