[Bf-blender-cvs] [42ad3282c5c] greasepencil-refactor: GPencil: Refactor: Rewrite the render pipeline

Clément Foucault noreply at git.blender.org
Thu Jan 9 16:00:26 CET 2020


Commit: 42ad3282c5c1dddcf1fe9bd86dbfba0d6f0fb148
Author: Clément Foucault
Date:   Thu Jan 9 00:26:16 2020 +0100
Branches: greasepencil-refactor
https://developer.blender.org/rB42ad3282c5c1dddcf1fe9bd86dbfba0d6f0fb148

GPencil: Refactor: Rewrite the render pipeline

This was really outdated. We do everything on the GPU now.

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

M	source/blender/draw/engines/gpencil/gpencil_engine.c
M	source/blender/draw/engines/gpencil/gpencil_engine.h
M	source/blender/draw/engines/gpencil/gpencil_render.c

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

diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.c b/source/blender/draw/engines/gpencil/gpencil_engine.c
index ef02da6f5ef..beaf64648d5 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.c
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.c
@@ -69,7 +69,9 @@ void GPENCIL_engine_init(void *ved)
   GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
   GPENCIL_StorageList *stl = vedata->stl;
   GPENCIL_TextureList *txl = vedata->txl;
+  GPENCIL_FramebufferList *fbl = vedata->fbl;
   DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
 
   if (!stl->pd) {
     stl->pd = MEM_callocN(sizeof(GPENCIL_PrivateData), "GPENCIL_PrivateData");
@@ -102,6 +104,7 @@ void GPENCIL_engine_init(void *ved)
   stl->pd->sbuffer_tobjects.last = NULL;
   stl->pd->draw_depth_only = !DRW_state_is_fbo();
   stl->pd->scene_depth_tx = stl->pd->draw_depth_only ? txl->dummy_texture : dtxl->depth;
+  stl->pd->scene_fb = dfbl->default_fb;
   stl->pd->is_render = true; /* TODO */
   stl->pd->global_light_pool = gpencil_light_pool_add(stl->pd);
   stl->pd->shadeless_light_pool = gpencil_light_pool_add(stl->pd);
@@ -109,6 +112,11 @@ void GPENCIL_engine_init(void *ved)
    * so we set the last light pool to NULL. */
   stl->pd->last_light_pool = NULL;
 
+  if (txl->render_depth_tx != NULL) {
+    stl->pd->scene_depth_tx = txl->render_depth_tx;
+    stl->pd->scene_fb = fbl->render_fb;
+  }
+
   gpencil_light_ambient_add(stl->pd->shadeless_light_pool, (float[3]){1.0f, 1.0f, 1.0f});
 
   const DRWContextState *ctx = DRW_context_state_get();
@@ -697,8 +705,7 @@ static void GPENCIL_draw_object(GPENCIL_Data *vedata, GPENCIL_tObject *ob)
   GPENCIL_PassList *psl = vedata->psl;
   GPENCIL_PrivateData *pd = vedata->stl->pd;
   GPENCIL_FramebufferList *fbl = vedata->fbl;
-  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
-  float clear_cols[2][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}};
+  float clear_cols[2][4] = {{0.0f, 0.5f, 0.0f, 0.0f}, {1.0f, 0.5f, 1.0f, 1.0f}};
 
   DRW_stats_group_start("GPencil Object");
 
@@ -750,9 +757,8 @@ static void GPENCIL_draw_object(GPENCIL_Data *vedata, GPENCIL_tObject *ob)
   copy_m4_m4(pd->object_bound_mat, ob->plane_mat);
   pd->is_stroke_order_3d = ob->is_drawmode3d;
 
-  /* TODO fix for render */
-  if (dfbl->depth_only_fb) {
-    GPU_framebuffer_bind(dfbl->depth_only_fb);
+  if (pd->scene_fb) {
+    GPU_framebuffer_bind(pd->scene_fb);
     DRW_draw_pass(psl->merge_depth_ps);
   }
 
@@ -800,7 +806,6 @@ void GPENCIL_draw_scene(void *ved)
   GPENCIL_PassList *psl = vedata->psl;
   GPENCIL_PrivateData *pd = vedata->stl->pd;
   GPENCIL_FramebufferList *fbl = vedata->fbl;
-  DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
   const DRWContextState *draw_ctx = DRW_context_state_get();
   float clear_cols[2][4] = {{0.0f, 0.0f, 0.0f, 0.0f}, {1.0f, 1.0f, 1.0f, 1.0f}};
 
@@ -834,8 +839,8 @@ void GPENCIL_draw_scene(void *ved)
     GPENCIL_antialiasing_draw(vedata);
   }
 
-  if (dfbl->default_fb) {
-    GPU_framebuffer_bind(dfbl->default_fb);
+  if (pd->scene_fb) {
+    GPU_framebuffer_bind(pd->scene_fb);
     DRW_draw_pass(psl->composite_ps);
   }
 
diff --git a/source/blender/draw/engines/gpencil/gpencil_engine.h b/source/blender/draw/engines/gpencil/gpencil_engine.h
index 0cb417fd467..e86a37618c0 100644
--- a/source/blender/draw/engines/gpencil/gpencil_engine.h
+++ b/source/blender/draw/engines/gpencil/gpencil_engine.h
@@ -203,9 +203,7 @@ typedef struct GPENCIL_PassList {
 } GPENCIL_PassList;
 
 typedef struct GPENCIL_FramebufferList {
-  struct GPUFrameBuffer *main;
-
-  /* Refactored */
+  struct GPUFrameBuffer *render_fb;
   struct GPUFrameBuffer *gpencil_fb;
   struct GPUFrameBuffer *snapshot_fb;
   struct GPUFrameBuffer *layer_fb;
@@ -225,7 +223,9 @@ typedef struct GPENCIL_TextureList {
   /* Textures used by Antialiasing. */
   struct GPUTexture *smaa_area_tx;
   struct GPUTexture *smaa_search_tx;
-
+  /* Textures used during render. Containing underlying rendered scene. */
+  struct GPUTexture *render_depth_tx;
+  struct GPUTexture *render_color_tx;
 } GPENCIL_TextureList;
 
 typedef struct GPENCIL_Data {
@@ -234,11 +234,6 @@ typedef struct GPENCIL_Data {
   struct GPENCIL_TextureList *txl;
   struct GPENCIL_PassList *psl;
   struct GPENCIL_StorageList *stl;
-
-  /* render textures */
-  struct GPUTexture *render_depth_tx;
-  struct GPUTexture *render_color_tx;
-
 } GPENCIL_Data;
 
 /* *********** STATIC *********** */
@@ -277,6 +272,7 @@ typedef struct GPENCIL_PrivateData {
   GPUTexture *smaa_weight_tx;
   /* Pointer to dtxl->depth */
   GPUTexture *scene_depth_tx;
+  GPUFrameBuffer *scene_fb;
   /* Current frame */
   int cfra;
   /* If we are rendering for final render (F12). */
@@ -291,8 +287,6 @@ typedef struct GPENCIL_PrivateData {
   float camera_pos[3];
   /* Pseudo depth of field parameter. Used to scale blur radius. */
   float dof_params[2];
-  /* Viewvecs to compute view Z from depth buffer. */
-  float view_vecs[2][4];
   /* Used for DoF Setup. */
   Object *camera;
 
@@ -431,7 +425,8 @@ void GPENCIL_draw_scene(void *vedata);
 /* render */
 void GPENCIL_render_init(struct GPENCIL_Data *ved,
                          struct RenderEngine *engine,
-                         struct Depsgraph *depsgraph);
+                         struct RenderLayer *render_layer,
+                         const struct Depsgraph *depsgraph);
 void GPENCIL_render_to_image(void *vedata,
                              struct RenderEngine *engine,
                              struct RenderLayer *render_layer,
diff --git a/source/blender/draw/engines/gpencil/gpencil_render.c b/source/blender/draw/engines/gpencil/gpencil_render.c
index bf29a6698b9..11668cfb2d7 100644
--- a/source/blender/draw/engines/gpencil/gpencil_render.c
+++ b/source/blender/draw/engines/gpencil/gpencil_render.c
@@ -33,53 +33,21 @@
 
 #include "gpencil_engine.h"
 
-/* Get pixel size for render
- * This function uses the same calculation used for viewport, because if use
- * camera pixelsize, the result is not correct.
- */
-static float UNUSED_FUNCTION(get_render_pixelsize)(float persmat[4][4], int winx, int winy)
-{
-  float v1[3], v2[3];
-  float len_px, len_sc;
-
-  v1[0] = persmat[0][0];
-  v1[1] = persmat[1][0];
-  v1[2] = persmat[2][0];
-
-  v2[0] = persmat[0][1];
-  v2[1] = persmat[1][1];
-  v2[2] = persmat[2][1];
-
-  len_px = 2.0f / sqrtf(min_ff(len_squared_v3(v1), len_squared_v3(v2)));
-  len_sc = (float)MAX2(winx, winy);
-
-  return len_px / len_sc;
-}
-
 /* init render data */
-void GPENCIL_render_init(GPENCIL_Data *ved, RenderEngine *engine, struct Depsgraph *depsgraph)
+void GPENCIL_render_init(GPENCIL_Data *vedata,
+                         RenderEngine *engine,
+                         struct RenderLayer *render_layer,
+                         const Depsgraph *depsgraph)
 {
-  GPENCIL_Data *vedata = (GPENCIL_Data *)ved;
   GPENCIL_FramebufferList *fbl = vedata->fbl;
+  GPENCIL_TextureList *txl = vedata->txl;
 
   Scene *scene = DEG_get_evaluated_scene(depsgraph);
   const float *viewport_size = DRW_viewport_size_get();
   const int size[2] = {(int)viewport_size[0], (int)viewport_size[1]};
 
-  /* In render mode the default framebuffer is not generated
-   * because there is no viewport. So we need to manually create one
-   * NOTE : use 32 bit format for precision in render mode.
-   */
-  vedata->render_depth_tx = DRW_texture_pool_query_2d(
-      size[0], size[1], GPU_DEPTH_COMPONENT24, &draw_engine_gpencil_type);
-  vedata->render_color_tx = DRW_texture_pool_query_2d(
-      size[0], size[1], GPU_RGBA32F, &draw_engine_gpencil_type);
-  GPU_framebuffer_ensure_config(&fbl->main,
-                                {GPU_ATTACHMENT_TEXTURE(vedata->render_depth_tx),
-                                 GPU_ATTACHMENT_TEXTURE(vedata->render_color_tx)});
-
   /* Set the pers & view matrix. */
-  float winmat[4][4], viewmat[4][4], viewinv[4][4], persmat[4][4];
+  float winmat[4][4], viewmat[4][4], viewinv[4][4];
 
   struct Object *camera = DEG_get_evaluated_object(depsgraph, RE_GetCamera(engine->re));
   float frame = BKE_scene_frame_get(scene);
@@ -92,78 +60,70 @@ void GPENCIL_render_init(GPENCIL_Data *ved, RenderEngine *engine, struct Depsgra
   DRW_view_default_set(view);
   DRW_view_set_active(view);
 
-  DRW_view_persmat_get(NULL, persmat, false);
+  /* Create depth texture & color texture from render result. */
+  const char *viewname = RE_GetActiveRenderView(engine->re);
+  RenderPass *rpass_z_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_Z, viewname);
+  RenderPass *rpass_col_src = RE_pass_find_by_name(render_layer, RE_PASSNAME_COMBINED, viewname);
+
+  float *pix_z = (rpass_z_src) ? rpass_z_src->rect : NULL;
+  float *pix_col = (rpass_col_src) ? rpass_col_src->rect : NULL;
+
+  if (!pix_z || !pix_col) {
+    /* TODO: put this message in a better place */
+    printf("Warning: To render grease pencil, enable Combined and Z passes.\n");
+  }
+
+  if (pix_z) {
+    /* Depth need to be remapped to [0..1] range. */
+    pix_z = MEM_dupallocN(pix_z);
+
+    int pix_ct = rpass_z_src->rectx * rpass_z_src->recty;
+
+    if (DRW_view_is_persp_get(view)) {
+      for (int i = 0; i < pix_ct; i++) {
+        pix_z[i] = (-winmat[3][2] / -pix_z[i]) - winmat[2][2];
+        pix_z[i] = clamp_f(pix_z[i] * 0.5f + 0.5f, 0.0f, 1.0f);
+      }
+    }
+    else {
+      /* Keep in mind, near and far distance are negatives. */
+      float near = DRW_view_near_distance_get(view);
+      float far = DRW_view_far_distance_get(view);
+      float range_inv = 1.0f / fabsf(far - near);
+      for (int i = 0; i < pix_ct; i++) {
+        pix_z[i] = (pix_z[i] + near) * range_inv;
+        pix_z[i] = clamp_f(pix_z[i], 0.0f, 1.0f);
+      }
+    }
+  }
+
+  /* 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, pix_z);
+  txl->render_color_tx = DRW_texture_create_2d(size[0], size[1], GPU_RGBA16F, 0, pix_col);
+
+  GPU_framebuffer_ensure_config(&fbl->render_fb,
+                                

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list