[Bf-blender-cvs] [62a7ac8f17e] tmp-workbench-rewrite: Workbench: Refactor: Add Infront support
Clément Foucault
noreply at git.blender.org
Tue Mar 3 17:36:01 CET 2020
Commit: 62a7ac8f17ee8bf576f4d8db4a901598d2e64c74
Author: Clément Foucault
Date: Sun Mar 1 14:26:56 2020 +0100
Branches: tmp-workbench-rewrite
https://developer.blender.org/rB62a7ac8f17ee8bf576f4d8db4a901598d2e64c74
Workbench: Refactor: Add Infront support
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_engine.c
A source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
M source/blender/draw/engines/workbench/workbench_deferred.c
M source/blender/draw/engines/workbench/workbench_engine.c
M source/blender/draw/engines/workbench/workbench_materials.c
M source/blender/draw/engines/workbench/workbench_opaque.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_shader.c
M source/blender/draw/engines/workbench/workbench_transparent.c
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 54db2655de2..3ce2681072f 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -265,6 +265,7 @@ data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_frag.glsl SRC
data_to_c_simple(engines/workbench/shaders/workbench_image_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_matcap_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_material_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_merge_infront_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_object_outline_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index a8d2c4c6cf0..cc8bd0e51ba 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -373,9 +373,6 @@ static void OVERLAY_cache_finish(void *vedata)
DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
- GPU_framebuffer_ensure_config(
- &dfbl->default_fb,
- {GPU_ATTACHMENT_TEXTURE(dtxl->depth), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
GPU_framebuffer_ensure_config(
&dfbl->in_front_fb,
{GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
new file mode 100644
index 00000000000..58becb03290
--- /dev/null
+++ b/source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
@@ -0,0 +1,18 @@
+
+uniform sampler2D depthBuffer;
+
+in vec4 uvcoordsvar;
+
+out vec4 fragColor;
+
+void main()
+{
+ float depth = texture(depthBuffer, uvcoordsvar.st).r;
+ /* Discard background pixels. */
+ if (depth == 1.0) {
+ discard;
+ }
+ /* Make this fragment occlude any fragment that will try to
+ * render over it in the normal passes. */
+ gl_FragDepth = 0.0;
+}
\ No newline at end of file
diff --git a/source/blender/draw/engines/workbench/workbench_deferred.c b/source/blender/draw/engines/workbench/workbench_deferred.c
index 762eeced176..f1528c2213c 100644
--- a/source/blender/draw/engines/workbench/workbench_deferred.c
+++ b/source/blender/draw/engines/workbench/workbench_deferred.c
@@ -508,7 +508,7 @@ void workbench_deferred_engine_init(WORKBENCH_Data *vedata)
size[0], size[1], GPU_R16, &draw_engine_workbench_solid);
}
- GPU_framebuffer_ensure_config(&fbl->prepass_fb,
+ GPU_framebuffer_ensure_config(&fbl->opaque_fb,
{
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
GPU_ATTACHMENT_TEXTURE(e_data.color_buffer_tx),
@@ -1286,8 +1286,8 @@ void workbench_deferred_draw_scene(WORKBENCH_Data *vedata)
GPU_framebuffer_clear_color(fbl->id_clear_fb, clear_col);
}
- GPU_framebuffer_bind(fbl->prepass_fb);
- GPU_framebuffer_clear(fbl->prepass_fb, clear_bits, clear_col, clear_depth, clear_stencil);
+ GPU_framebuffer_bind(fbl->opaque_fb);
+ GPU_framebuffer_clear(fbl->opaque_fb, clear_bits, clear_col, clear_depth, clear_stencil);
DRW_draw_pass(psl->prepass_pass);
DRW_draw_pass(psl->prepass_hair_pass);
diff --git a/source/blender/draw/engines/workbench/workbench_engine.c b/source/blender/draw/engines/workbench/workbench_engine.c
index 0879e5d98b4..25ede8e627b 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.c
+++ b/source/blender/draw/engines/workbench/workbench_engine.c
@@ -268,6 +268,19 @@ static void workbench_cache_finish(void *ved)
WORKBENCH_StorageList *stl = vedata->stl;
WORKBENCH_PrivateData *wpd = stl->wpd;
+ /* TODO(fclem) Only do this when really needed. */
+ {
+ /* HACK we allocate the infront depth here to avoid the overhead when if is not needed. */
+ DefaultFramebufferList *dfbl = DRW_viewport_framebuffer_list_get();
+ DefaultTextureList *dtxl = DRW_viewport_texture_list_get();
+
+ DRW_texture_ensure_fullscreen_2d(&dtxl->depth_in_front, GPU_DEPTH24_STENCIL8, 0);
+
+ GPU_framebuffer_ensure_config(
+ &dfbl->in_front_fb,
+ {GPU_ATTACHMENT_TEXTURE(dtxl->depth_in_front), GPU_ATTACHMENT_TEXTURE(dtxl->color)});
+ }
+
workbench_update_material_ubos(wpd);
if (wpd->material_hash) {
@@ -285,24 +298,27 @@ static void workbench_draw_scene(void *ved)
float clear_col[4] = {0.0f, 0.0f, 0.0f, 0.0f};
float clear_col_with_alpha[4] = {0.0f, 0.0f, 0.0f, 1.0f};
+ {
+ GPU_framebuffer_bind(dfbl->in_front_fb);
+ GPU_framebuffer_clear_depth(dfbl->in_front_fb, 1.0f);
+ }
+
GPU_framebuffer_bind(dfbl->color_only_fb);
GPU_framebuffer_clear_color(dfbl->color_only_fb, clear_col);
{
- GPU_framebuffer_bind(fbl->prepass_fb);
- DRW_draw_pass(psl->prepass_pass);
+ GPU_framebuffer_bind(fbl->opaque_fb);
+ DRW_draw_pass(psl->opaque_pass);
/* TODO(fclem) shadows */
// DRW_draw_pass(psl->shadow_pass);
{
- /* TODO(fclem) infront */
- // GPU_framebuffer_bind(fbl->prepass_infront_fb);
- // DRW_draw_pass(psl->prepass_infront_pass);
+ GPU_framebuffer_bind(fbl->opaque_infront_fb);
+ DRW_draw_pass(psl->opaque_infront_pass);
- /* TODO(fclem) merge infront depth & stencil. */
- // GPU_framebuffer_bind(fbl->prepass_fb);
- // DRW_draw_pass(psl->merge_infront_pass);
+ GPU_framebuffer_bind(fbl->opaque_fb);
+ DRW_draw_pass(psl->merge_infront_pass);
}
GPU_framebuffer_bind(dfbl->default_fb);
@@ -322,14 +338,18 @@ static void workbench_draw_scene(void *ved)
DRW_draw_pass(psl->transp_accum_pass);
- {
- /* TODO(fclem) infront */
- // GPU_framebuffer_bind(fbl->tranp_accum_infront_fb);
- // DRW_draw_pass(psl->transp_accum_infront_pass);
- }
-
GPU_framebuffer_bind(dfbl->color_only_fb);
DRW_draw_pass(psl->transp_resolve_pass);
+
+ {
+ GPU_framebuffer_bind(fbl->transp_accum_infront_fb);
+ GPU_framebuffer_clear_color(fbl->transp_accum_infront_fb, clear_col_with_alpha);
+
+ DRW_draw_pass(psl->transp_accum_infront_pass);
+
+ GPU_framebuffer_bind(dfbl->color_only_fb);
+ DRW_draw_pass(psl->transp_resolve_pass);
+ }
}
/* TODO(fclem) outline */
diff --git a/source/blender/draw/engines/workbench/workbench_materials.c b/source/blender/draw/engines/workbench/workbench_materials.c
index e93ee59f85f..f358e3028dd 100644
--- a/source/blender/draw/engines/workbench/workbench_materials.c
+++ b/source/blender/draw/engines/workbench/workbench_materials.c
@@ -474,6 +474,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
Image *ima = NULL;
ImageUser *iuser = NULL;
int interp;
+ const bool infront = (ob->dtx & OB_DRAWXRAY) != 0;
if (color_type == V3D_SHADING_TEXTURE_COLOR) {
workbench_material_get_image(ob, mat_nr, &ima, &iuser, &interp);
@@ -507,7 +508,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
workbench_material_ubo_data(wpd, ob, ma, &wpd->material_ubo_data_curr[id], color_type);
const bool transp = wpd->shading.xray_alpha < 1.0f || ma->a < 1.0f;
- DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp;
+ DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp;
*grp_mat = grp = DRW_shgroup_create_sub(grp);
DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
DRW_shgroup_uniform_int_copy(grp, "materialIndex", id & 0xFFFu);
@@ -515,7 +516,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
}
case V3D_SHADING_VERTEX_COLOR: {
const bool transp = wpd->shading.xray_alpha < 1.0f;
- DRWShadingGroup *grp = wpd->prepass[transp].vcol_shgrp;
+ DRWShadingGroup *grp = wpd->prepass[transp][infront].vcol_shgrp;
return grp;
}
default: {
@@ -530,7 +531,7 @@ DRWShadingGroup *workbench_material_setup(WORKBENCH_PrivateData *wpd,
workbench_material_ubo_data(wpd, ob, NULL, &wpd->material_ubo_data_curr[id], color_type);
const bool transp = wpd->shading.xray_alpha < 1.0f || ob->color[3] < 1.0f;
- DRWShadingGroup *grp = wpd->prepass[transp].common_shgrp;
+ DRWShadingGroup *grp = wpd->prepass[transp][infront].common_shgrp;
if (resource_changed) {
grp = DRW_shgroup_create_sub(grp);
DRW_shgroup_uniform_block(grp, "material_block", wpd->material_ubo_curr);
@@ -570,9 +571,10 @@ DRWShadingGroup *workbench_image_setup(
return *grp_tex;
}
+ const bool infront = (ob->dtx & OB_DRAWXRAY) != 0;
const bool transp = wpd->shading.xray_alpha < 1.0f;
- DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp].image_tiled_shgrp :
- wpd->prepass[transp].image_shgrp;
+ DRWShadingGroup *grp = (tex_tile_data) ? wpd->prepass[transp][infront].image_tiled_shgrp :
+ wpd->prepass[transp][infront].image_shgrp;
*grp_tex = grp = DRW_shgroup_create_sub(grp);
if (tex_tile_data) {
diff --git a/source/blender/draw/engines/workbench/workbench_opaque.c b/source/blender/draw/engines/workbench/workbench_opaque.c
index 0f1b91ce015..7ab11631f0b 100644
--- a/source/blender/draw/engines/workbench/workbench_opaque.c
+++ b/source/blender/draw/engines/workbench/workbench_opaque.c
@@ -45,13 +45,21 @@ void workbench_opaque_engine_init(WORKBENCH_Data *data)
wpd->object_id_tx = DRW_texture_pool_query_fullscreen(id_tex_format, owner);
}
- GPU_framebuffer_ensure_config(&fbl->prepass_fb,
+ GPU_framebuffer_ensure_config(&fbl->opaque_fb,
{
GPU_ATTACHMENT_TEXTURE(dtxl->depth),
GPU_ATTACHMENT_TEXTURE(wpd->material_buffer_tx),
GPU_ATTACHMENT_TEXTURE(wpd->normal_bu
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list