[Bf-blender-cvs] [e60bc528f0f] master: DrawManager: Adding Custom Render Passes

Jeroen Bakker noreply at git.blender.org
Wed Oct 21 08:15:15 CEST 2020


Commit: e60bc528f0f936d64abdc261df961f60e919facb
Author: Jeroen Bakker
Date:   Wed Oct 21 08:09:52 2020 +0200
Branches: master
https://developer.blender.org/rBe60bc528f0f936d64abdc261df961f60e919facb

DrawManager: Adding Custom Render Passes

Currently render passes in the draw manager (eevee) must be predefined
in the render result. This patch would ask the render engine for the
render passes it needs, and create these as a preparation step during
rendering. This allows any draw engine to define more complex render
passes setup.

Render passes can only be added before the call to `RE_engine_begin_result`.
`RE_engine_begin_result` makes a full copy of the render passes. During
rendering the render engines renders to the duplicated passes.
`RE_engine_end_result` syncs the data back to the original render passes,
but only if the passes existed in the original render result.
Currently we work-around this issue by registering the passes in
`render_result_new`. This is legacy blender internal structure and should
be avoided.

With upcoming projects (AOV/Cryptomatte) it becomes a bit of a mess as we
are extending legacy code to support new features. This patch allows us to
let each draw engine register their own render passes at render time
(similar to cycles and other render engines). In the future we could get
rid of legacy render passes registration in render_result_new.

Reviewed By: Clément Foucault

Differential Revision: https://developer.blender.org/D9088

===================================================================

M	source/blender/draw/intern/draw_manager.c
M	source/blender/render/intern/source/render_result.c

===================================================================

diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index ff12a055361..f995582149a 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1803,6 +1803,20 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
   DST.buffer_finish_called = false;
 }
 
+/* Callback function for RE_engine_update_render_passes to ensure all
+ * render passes are registered. */
+static void draw_render_result_ensure_pass_cb(void *user_data,
+                                              struct Scene *UNUSED(scene),
+                                              struct ViewLayer *view_layer,
+                                              const char *name,
+                                              int channels,
+                                              const char *chanid,
+                                              eNodeSocketDatatype UNUSED(type))
+{
+  RenderEngine *engine = user_data;
+  RE_engine_add_pass(engine, name, channels, chanid, view_layer->name);
+}
+
 void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
 {
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
@@ -1851,6 +1865,10 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
   /* set default viewport */
   GPU_viewport(0, 0, size[0], size[1]);
 
+  /* Update the render passes. This needs to be done before acquiring the render result. */
+  RE_engine_update_render_passes(
+      engine, scene, view_layer, draw_render_result_ensure_pass_cb, engine);
+
   /* Init render result. */
   RenderResult *render_result = RE_engine_begin_result(engine,
                                                        0,
@@ -1859,7 +1877,6 @@ void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
                                                        size[1],
                                                        view_layer->name,
                                                        /* RR_ALL_VIEWS */ NULL);
-
   RenderLayer *render_layer = render_result->layers.first;
   for (RenderView *render_view = render_result->views.first; render_view != NULL;
        render_view = render_view->next) {
diff --git a/source/blender/render/intern/source/render_result.c b/source/blender/render/intern/source/render_result.c
index d2f21ab035c..db75cb5cfed 100644
--- a/source/blender/render/intern/source/render_result.c
+++ b/source/blender/render/intern/source/render_result.c
@@ -444,15 +444,6 @@ RenderResult *render_result_new(Render *re,
       if (view_layer->passflag & SCE_PASS_SUBSURFACE_COLOR) {
         RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_SUBSURFACE_COLOR, view, "RGB");
       }
-      if (view_layer->eevee.render_passes & EEVEE_RENDER_PASS_BLOOM) {
-        RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_BLOOM, view, "RGB");
-      }
-      if (view_layer->eevee.render_passes & EEVEE_RENDER_PASS_VOLUME_SCATTER) {
-        RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_VOLUME_SCATTER, view, "RGB");
-      }
-      if (view_layer->eevee.render_passes & EEVEE_RENDER_PASS_VOLUME_TRANSMITTANCE) {
-        RENDER_LAYER_ADD_PASS_SAFE(rr, rl, 3, RE_PASSNAME_VOLUME_TRANSMITTANCE, view, "RGB");
-      }
 #undef RENDER_LAYER_ADD_PASS_SAFE
     }
   }



More information about the Bf-blender-cvs mailing list