[Bf-blender-cvs] [c476c36e400] master: Workbench Simplification Refactor
Clément Foucault
noreply at git.blender.org
Wed Mar 11 17:14:23 CET 2020
Commit: c476c36e400883d929a7149def8dcb6ad6157a86
Author: Clément Foucault
Date: Wed Mar 11 17:07:43 2020 +0100
Branches: master
https://developer.blender.org/rBc476c36e400883d929a7149def8dcb6ad6157a86
Workbench Simplification Refactor
This patch is (almost) a complete rewrite of workbench engine.
The features remain unchanged but the code quality is greatly improved.
Hair shading is brighter but also more correct.
This also introduce the concept of `DRWShaderLibrary` to make a simple
include system inside the GLSL files.
Differential Revision: https://developer.blender.org/D7060
===================================================================
M source/blender/blenlib/intern/BLI_memblock.c
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/overlay/overlay_engine.c
M source/blender/draw/engines/overlay/overlay_wireframe.c
D source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_common_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_composite_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_data_lib.glsl
D source/blender/draw/engines/workbench/shaders/workbench_deferred_background_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_deferred_composite_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_effect_cavity_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_effect_fxaa_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_effect_outline_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_effect_taa_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_forward_composite_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_forward_depth_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_ghost_resolve_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_image_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_matcap_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_material_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_merge_infront_frag.glsl
D source/blender/draw/engines/workbench/shaders/workbench_object_outline_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_prepass_hair_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_prepass_vert.glsl
A source/blender/draw/engines/workbench/shaders/workbench_shader_interface_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_shadow_debug_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
A source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_volume_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_volume_vert.glsl
M source/blender/draw/engines/workbench/shaders/workbench_world_light_lib.glsl
D source/blender/draw/engines/workbench/solid_mode.c
D source/blender/draw/engines/workbench/transparent_mode.c
M source/blender/draw/engines/workbench/workbench_data.c
D source/blender/draw/engines/workbench/workbench_deferred.c
D source/blender/draw/engines/workbench/workbench_effect_aa.c
A source/blender/draw/engines/workbench/workbench_effect_antialiasing.c
A source/blender/draw/engines/workbench/workbench_effect_cavity.c
M source/blender/draw/engines/workbench/workbench_effect_dof.c
D source/blender/draw/engines/workbench/workbench_effect_fxaa.c
A source/blender/draw/engines/workbench/workbench_effect_outline.c
D source/blender/draw/engines/workbench/workbench_effect_taa.c
M source/blender/draw/engines/workbench/workbench_engine.c
M source/blender/draw/engines/workbench/workbench_engine.h
D source/blender/draw/engines/workbench/workbench_forward.c
M source/blender/draw/engines/workbench/workbench_materials.c
A source/blender/draw/engines/workbench/workbench_opaque.c
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_render.c
A source/blender/draw/engines/workbench/workbench_shader.c
A source/blender/draw/engines/workbench/workbench_shadow.c
D source/blender/draw/engines/workbench/workbench_studiolight.c
A source/blender/draw/engines/workbench/workbench_transparent.c
M source/blender/draw/engines/workbench/workbench_volume.c
M source/blender/draw/intern/DRW_render.h
M source/blender/draw/intern/draw_common.h
M source/blender/draw/intern/draw_hair.c
M source/blender/draw/intern/draw_manager.c
M source/blender/draw/intern/draw_manager_data.c
M source/blender/draw/intern/draw_manager_shader.c
M source/blender/draw/intern/draw_manager_texture.c
M source/blender/gpu/shaders/gpu_shader_common_obinfos_lib.glsl
M source/blender/makesdna/DNA_view3d_enums.h
===================================================================
diff --git a/source/blender/blenlib/intern/BLI_memblock.c b/source/blender/blenlib/intern/BLI_memblock.c
index ee9ea15835b..b532202ebaa 100644
--- a/source/blender/blenlib/intern/BLI_memblock.c
+++ b/source/blender/blenlib/intern/BLI_memblock.c
@@ -191,10 +191,14 @@ void *BLI_memblock_iterstep(BLI_memblock_iter *iter)
return ptr;
}
-/* Direct access. elem is element index inside the chosen chunk. */
+/* Direct access. elem is element index inside the chosen chunk.
+ * Double usage: You can set chunk to 0 and set the absolute elem index.
+ * The correct chunk will be retrieve. */
void *BLI_memblock_elem_get(BLI_memblock *mblk, int chunk, int elem)
{
BLI_assert(chunk < mblk->chunk_len);
- BLI_assert(elem < (mblk->chunk_size / mblk->elem_size));
+ int elem_per_chunk = mblk->chunk_size / mblk->elem_size;
+ chunk += elem / elem_per_chunk;
+ elem = elem % elem_per_chunk;
return (char *)(mblk->chunk_list[chunk]) + mblk->elem_size * elem;
}
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index 1f04739644e..fe03a32fd07 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -97,19 +97,18 @@ set(SRC
engines/eevee/eevee_subsurface.c
engines/eevee/eevee_temporal_sampling.c
engines/eevee/eevee_volumes.c
- engines/workbench/solid_mode.c
- engines/workbench/transparent_mode.c
engines/workbench/workbench_data.c
- engines/workbench/workbench_deferred.c
- engines/workbench/workbench_effect_aa.c
+ engines/workbench/workbench_effect_antialiasing.c
+ engines/workbench/workbench_effect_cavity.c
engines/workbench/workbench_effect_dof.c
- engines/workbench/workbench_effect_fxaa.c
- engines/workbench/workbench_effect_taa.c
+ engines/workbench/workbench_effect_outline.c
engines/workbench/workbench_engine.c
- engines/workbench/workbench_forward.c
engines/workbench/workbench_materials.c
+ engines/workbench/workbench_opaque.c
engines/workbench/workbench_render.c
- engines/workbench/workbench_studiolight.c
+ engines/workbench/workbench_shader.c
+ engines/workbench/workbench_shadow.c
+ engines/workbench/workbench_transparent.c
engines/workbench/workbench_volume.c
engines/external/external_engine.c
engines/gpencil/gpencil_antialiasing.c
@@ -247,28 +246,32 @@ data_to_c_simple(engines/eevee/shaders/volumetric_scatter_frag.glsl SRC)
data_to_c_simple(engines/eevee/shaders/volumetric_integration_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_cavity_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_cavity_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_common_lib.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_composite_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_curvature_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_data_lib.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_deferred_composite_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_deferred_background_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_cavity_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_effect_dof_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_effect_fxaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_outline_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_effect_smaa_vert.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_effect_taa_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_composite_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_depth_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_forward_transparent_accum_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_ghost_resolve_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)
+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_prepass_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_hair_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_prepass_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shader_interface_lib.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_shadow_caps_geom.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_shadow_debug_frag.glsl SRC)
-data_to_c_simple(engines/workbench/shaders/workbench_volume_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_geom.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_shadow_vert.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_accum_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_transparent_resolve_frag.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_volume_frag.glsl SRC)
+data_to_c_simple(engines/workbench/shaders/workbench_volume_vert.glsl SRC)
data_to_c_simple(engines/workbench/shaders/workbench_world_light_lib.glsl SRC)
data_to_c_simple(intern/shaders/common_colormanagement_lib.glsl SRC)
diff --git a/source/blender/draw/engines/overlay/overlay_engine.c b/source/blender/draw/engines/overlay/overlay_engine.c
index cfa0fa9eb1a..740ca42800e 100644
--- a/source/blender/draw/engines/overlay/overlay_engine.c
+++ b/source/blender/draw/engines/overlay/overlay_engine.c
@@ -381,9 +381,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/overlay/overlay_wireframe.c b/source/blender/draw/engines/overlay/overlay_wireframe.c
index 722055c36f0..6b0e5e0b72e 100644
--- a/source/blender/draw/engines/overlay/overlay_wireframe.c
+++ b/source/blender/draw/engines/overlay/overlay_wireframe.c
@@ -68,22 +68,17 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
OVERLAY_shader_wireframe();
for (int xray = 0; xray < (is_material_shmode ? 1 : 2); xray++) {
- /* Only do stencil test if stencil buffer is written by the render engine. */
- DRWState stencil_state = is_material_shmode ? 0 : DRW_STATE_STENCIL_EQUAL;
DRWState state = DRW_STATE_FIRST_VERTEX_CONVENTION | DRW_STATE_WRITE_COLOR |
DRW_STATE_WRITE_DEPTH | DRW_STATE_DEPTH_LESS_EQUAL;
DRWPass *pass;
- uint stencil_mask;
if (xray == 0) {
- DRW_PASS_CREATE(psl->wireframe_ps, state | stencil_state | pd->clipping_state);
+ DRW_PASS_CREATE(psl->wireframe_ps, state | pd->clipping_state);
pass = psl->wireframe_ps;
- stencil_mask = 0xFF;
}
else {
DRW_PASS_CREATE(psl->wireframe_xray_ps, state | pd->clipping_state);
pass = psl->wireframe_xray_ps;
- stencil_mask = 0x00;
}
for (int use_coloring = 0; use_coloring < 2; use_coloring++) {
@@ -94,17 +89,14 @@ void OVERLAY_wireframe_cache_init(OVERLAY_Data *vedata)
DRW_shgroup_uniform_bool_copy(grp, "isTransform", (G.moving & G_TRANSFORM_OBJ) != 0);
DRW_shgroup_uniform_bool_copy(grp, "isObjectColor", is_object_color);
DRW_shgroup_uniform_bool_copy(grp, "isRandomColor", is_random_color);
- DRW_shgroup_stencil_mask(grp, stencil_mask);
pd->wires_all_grp[xray][use_coloring] = grp = DRW_shgroup_create(wires_sh, pass);
DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 1.0f);
- DRW_shgroup_stencil_mask(grp, stencil_mask);
}
pd->wires_sculpt_grp[xray] = grp = DRW_shgroup_create(wires_sh, pass);
DRW_shgroup_uniform_float_copy(grp, "wireStepParam", 10.0f);
DRW_shgroup_uniform_bool_copy(grp, "useColoring", false);
- DRW_shgroup_stencil_mask(grp, stencil_mask);
}
if (is_material_shmode) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
deleted file mode 100644
index a0e04f252e2..00000000000
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_frag.glsl
+++ /dev/null
@@ -1,81 +0,0 @@
-out vec4 fragColor;
-
-uniform sampler2D depthBuffer;
-uniform sampler2D colorBuffer;
-uniform sampler2D normalBuffer;
-uniform usampler2D objectId;
-
-uniform vec2 invertedViewportSize;
-uniform mat4 WinMatrix; /* inverse WinMatrix */
-
-uniform vec4 viewvecs[3];
-uniform vec4 ssao_params;
-uniform vec4 ssao_settings;
-uniform vec2 curvature_settings;
-uniform sampler2D ssao_jitter;
-
-layout(std140) uniform samples_block
-{
- vec4 ssao_samples[500];
-};
-
-#define ssao_samples_num ssao_params.x
-#define jitter_tilling ssao_params.yz
-#define ssao_iteration ssao_params.w
-
-#define ssao_distance ssao_settings.x
-#define ssao_factor_cavity ssao_settings.y
-#define ssao_factor_edge ssao_settings.z
-#define ssao_attenuation ssao_settings.w
-
-vec3 get_view_space_from_depth(in vec2 uvcoords, in float depth)
-{
- if (WinMatrix[3][3] == 0.0) {
- /* Perspective */
- float d = 2.0 * depth - 1.0;
-
- float zview = -WinMatrix[3][2] / (d + WinMatrix[2][2]);
-
- return zview * (viewvecs[0].xyz + vec3(uvcoords, 0.0) *
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list