[Bf-blender-cvs] [8ba9efb7d8f] master: Fix T74811: GreasePencil Stereo Rendering

Jeroen Bakker noreply at git.blender.org
Fri Mar 20 07:48:18 CET 2020


Commit: 8ba9efb7d8ff399aaf3c65fd14272d0bc6f2ab39
Author: Jeroen Bakker
Date:   Tue Mar 17 08:57:04 2020 +0100
Branches: master
https://developer.blender.org/rB8ba9efb7d8ff399aaf3c65fd14272d0bc6f2ab39

Fix T74811: GreasePencil Stereo Rendering

When using grease pencil in a stereo rendering the grease pencil objects are
only visible in the left eye. In the viewport it renders both.

Issue is related that `DRW_render_gpencil` only renders a single view. But
`DRW_render_to_image` renders all views. This patch puts this in a loop to
render both eyes.

Reviewed By: fclem

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

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

M	source/blender/draw/engines/gpencil/gpencil_render.c
M	source/blender/draw/intern/draw_manager.c

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c
index 083b04c0600..496122c0483 100644
--- a/source/blender/draw/engines/gpencil/gpencil_render.c
+++ b/source/blender/draw/engines/gpencil/gpencil_render.c
@@ -104,10 +104,21 @@ void GPENCIL_render_init(GPENCIL_Data *vedata,
 
   /* FIXME(fclem): we have a precision loss in the depth buffer because of this reupload.
    * Find where it comes from! */
-  txl->render_depth_tx = DRW_texture_create_2d(
-      size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z);
-  txl->render_color_tx = DRW_texture_create_2d(
-      size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col);
+  /* In multi view render the textures can be reused. */
+  if (txl->render_depth_tx && !do_clear_z) {
+    GPU_texture_update(txl->render_depth_tx, GPU_DATA_FLOAT, pix_z);
+  }
+  else {
+    txl->render_depth_tx = DRW_texture_create_2d(
+        size[0], size[1], GPU_DEPTH_COMPONENT24, 0, do_region ? NULL : pix_z);
+  }
+  if (txl->render_color_tx && !do_clear_col) {
+    GPU_texture_update(txl->render_color_tx, GPU_DATA_FLOAT, pix_col);
+  }
+  else {
+    txl->render_color_tx = DRW_texture_create_2d(
+        size[0], size[1], GPU_RGBA16F, 0, do_region ? NULL : pix_col);
+  }
 
   GPU_framebuffer_ensure_config(&fbl->render_fb,
                                 {
diff --git a/source/blender/draw/intern/draw_manager.c b/source/blender/draw/intern/draw_manager.c
index adaa1dd6151..cc618c76ccd 100644
--- a/source/blender/draw/intern/draw_manager.c
+++ b/source/blender/draw/intern/draw_manager.c
@@ -1627,6 +1627,13 @@ bool DRW_render_check_grease_pencil(Depsgraph *depsgraph)
   return false;
 }
 
+static void drw_view_reset(void)
+{
+  DST.view_default = NULL;
+  DST.view_active = NULL;
+  DST.view_previous = NULL;
+}
+
 static void DRW_render_gpencil_to_image(RenderEngine *engine,
                                         struct RenderLayer *render_layer,
                                         const rcti *rect)
@@ -1701,10 +1708,13 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
 
   RenderResult *render_result = RE_engine_get_result(engine);
   RenderLayer *render_layer = RE_GetRenderLayer(render_result, view_layer->name);
-
-  DST.buffer_finish_called = false;
-
-  DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
+  for (RenderView *render_view = render_result->views.first; render_view != NULL;
+       render_view = render_view->next) {
+    RE_SetActiveRenderView(render, render_view->name);
+    drw_view_reset();
+    DST.buffer_finish_called = false;
+    DRW_render_gpencil_to_image(engine, render_layer, &render_rect);
+  }
 
   /* Force cache to reset. */
   drw_viewport_cache_resize();
@@ -1728,13 +1738,6 @@ void DRW_render_gpencil(struct RenderEngine *engine, struct Depsgraph *depsgraph
   DST.buffer_finish_called = false;
 }
 
-static void drw_view_reset(void)
-{
-  DST.view_default = NULL;
-  DST.view_active = NULL;
-  DST.view_previous = NULL;
-}
-
 void DRW_render_to_image(RenderEngine *engine, struct Depsgraph *depsgraph)
 {
   Scene *scene = DEG_get_evaluated_scene(depsgraph);



More information about the Bf-blender-cvs mailing list