[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