[Bf-blender-cvs] [a3055b75fbf] tmp-workbench-rewrite2: cavity & outline (needs refactor)
Miguel Pozo
noreply at git.blender.org
Fri Oct 21 21:11:48 CEST 2022
Commit: a3055b75fbf4d16041ada50eee99c2c79486423b
Author: Miguel Pozo
Date: Wed Oct 19 20:09:40 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rBa3055b75fbf4d16041ada50eee99c2c79486423b
cavity & outline (needs refactor)
===================================================================
M source/blender/draw/CMakeLists.txt
M source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
M source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
M source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
M source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
M source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
A source/blender/draw/engines/workbench/shaders/workbench_next_merge_depth_frag.glsl
A source/blender/draw/engines/workbench/workbench_effect_cavity.cc
M source/blender/draw/engines/workbench/workbench_engine.cc
M source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M source/blender/draw/engines/workbench/workbench_private.hh
A source/blender/draw/engines/workbench/workbench_resources.cc
M source/blender/draw/engines/workbench/workbench_shader_cache.cc
M source/blender/draw/engines/workbench/workbench_shader_shared.h
===================================================================
diff --git a/source/blender/draw/CMakeLists.txt b/source/blender/draw/CMakeLists.txt
index d84f0df816b..7a649bb67a1 100644
--- a/source/blender/draw/CMakeLists.txt
+++ b/source/blender/draw/CMakeLists.txt
@@ -157,6 +157,7 @@ set(SRC
engines/workbench/workbench_effect_antialiasing.c
engines/workbench/workbench_effect_antialiasing.cc
engines/workbench/workbench_effect_cavity.c
+ engines/workbench/workbench_effect_cavity.cc
engines/workbench/workbench_effect_dof.c
engines/workbench/workbench_effect_outline.c
engines/workbench/workbench_engine.c
@@ -166,6 +167,7 @@ set(SRC
engines/workbench/workbench_mesh_passes.cc
engines/workbench/workbench_opaque.c
engines/workbench/workbench_render.c
+ engines/workbench/workbench_resources.cc
engines/workbench/workbench_shader.cc
engines/workbench/workbench_shader_cache.cc
engines/workbench/workbench_shadow.c
@@ -471,6 +473,7 @@ set(GLSL_SRC
engines/workbench/shaders/workbench_matcap_lib.glsl
engines/workbench/shaders/workbench_material_lib.glsl
engines/workbench/shaders/workbench_merge_infront_frag.glsl
+ engines/workbench/shaders/workbench_next_merge_depth_frag.glsl
engines/workbench/shaders/workbench_prepass_frag.glsl
engines/workbench/shaders/workbench_prepass_hair_vert.glsl
engines/workbench/shaders/workbench_prepass_pointcloud_vert.glsl
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
index 5b8fee31f45..8c4875ca3e2 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_composite_info.hh
@@ -17,18 +17,6 @@ GPU_SHADER_CREATE_INFO(workbench_composite)
.fragment_source("workbench_composite_frag.glsl")
.additional_info("draw_fullscreen", "draw_view");
-GPU_SHADER_CREATE_INFO(workbench_next_composite)
- .local_group_size(8, 8)
- .sampler(3, ImageType::FLOAT_2D, "normal_tx")
- .sampler(4, ImageType::FLOAT_2D, "material_tx")
- .sampler(5, ImageType::DEPTH_2D, "depth_tx")
- .uniform_buf(WB_WORLD_SLOT, "WorldData", "world_data")
- .push_constant(Type::BOOL, "forceShadowing")
- .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_color_img")
- .typedef_source("workbench_shader_shared.h")
- .compute_source("workbench_composite_comp.glsl")
- .additional_info("draw_view");
-
/** \} */
/* -------------------------------------------------------------------- */
@@ -55,23 +43,69 @@ GPU_SHADER_CREATE_INFO(workbench_composite_flat)
/** \} */
/* -------------------------------------------------------------------- */
-/** \name Lighting Type
+/** \name Workbench Next
* \{ */
-GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_studio)
- .define("WORKBENCH_LIGHTING_STUDIO")
- .additional_info("workbench_next_composite")
- .do_static_compilation(true);
+GPU_SHADER_CREATE_INFO(workbench_next_composite)
+ .local_group_size(8, 8)
+ .sampler(3, ImageType::FLOAT_2D, "normal_tx")
+ .sampler(4, ImageType::FLOAT_2D, "material_tx")
+ .sampler(5, ImageType::DEPTH_2D, "depth_tx")
+ .uniform_buf(WB_WORLD_SLOT, "WorldData", "world_data")
+ .push_constant(Type::BOOL, "forceShadowing")
+ .image(0, GPU_RGBA16F, Qualifier::WRITE, ImageType::FLOAT_2D, "out_color_img")
+ .typedef_source("workbench_shader_shared.h")
+ .compute_source("workbench_composite_comp.glsl")
+ .additional_info("draw_view");
+
+// Lighting
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_studio).define("WORKBENCH_LIGHTING_STUDIO");
GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_matcap)
.define("WORKBENCH_LIGHTING_MATCAP")
- .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx")
- .additional_info("workbench_next_composite")
- .do_static_compilation(true);
+ .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx");
-GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_flat)
- .define("WORKBENCH_LIGHTING_FLAT")
- .additional_info("workbench_next_composite")
- .do_static_compilation(true);
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_opaque_flat).define("WORKBENCH_LIGHTING_FLAT");
+
+// Effects
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_curvature)
+ .define("WORKBENCH_CURVATURE")
+ .sampler(6, ImageType::UINT_2D, "object_id_tx");
+
+GPU_SHADER_CREATE_INFO(workbench_next_resolve_cavity)
+ .define("WORKBENCH_CAVITY")
+ .sampler(7, ImageType::FLOAT_2D, "jitter_tx") /* TODO(pragma37): GPU_SAMPLER_REPEAT is set in
+ CavityEffect, it doesn't work here ? */
+ .uniform_buf(5, "CavitySamples", "cavity_samples", Frequency::PASS);
+
+// Variations
+
+#define WORKBENCH_FINAL_VARIATION(name, ...) \
+ GPU_SHADER_CREATE_INFO(name).additional_info(__VA_ARGS__).do_static_compilation(true);
+
+#define WORKBENCH_CURVATURE_VARIATIONS(prefix, ...) \
+ WORKBENCH_FINAL_VARIATION(prefix##_curvature, "workbench_next_resolve_curvature", __VA_ARGS__) \
+ WORKBENCH_FINAL_VARIATION(prefix##_no_curvature, __VA_ARGS__)
+
+#define WORKBENCH_CAVITY_VARIATIONS(prefix, ...) \
+ WORKBENCH_CURVATURE_VARIATIONS(prefix##_cavity, "workbench_next_resolve_cavity", __VA_ARGS__) \
+ WORKBENCH_CURVATURE_VARIATIONS(prefix##_no_cavity, __VA_ARGS__)
+
+#define WORKBENCH_LIGHTING_VARIATIONS(prefix, ...) \
+ WORKBENCH_CAVITY_VARIATIONS( \
+ prefix##_opaque_studio, "workbench_next_resolve_opaque_studio", __VA_ARGS__) \
+ WORKBENCH_CAVITY_VARIATIONS( \
+ prefix##_opaque_matcap, "workbench_next_resolve_opaque_matcap", __VA_ARGS__) \
+ WORKBENCH_CAVITY_VARIATIONS( \
+ prefix##_opaque_flat, "workbench_next_resolve_opaque_flat", __VA_ARGS__)
+
+WORKBENCH_LIGHTING_VARIATIONS(workbench_next_resolve, "workbench_next_composite");
+
+#undef WORKBENCH_FINAL_VARIATION
+#undef WORKBENCH_CURVATURE_VARIATIONS
+#undef WORKBENCH_CAVITY_VARIATIONS
+#undef WORKBENCH_LIGHTING_VARIATIONS
/** \} */
diff --git a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
index e5ba0390244..03dd3a266e4 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_merge_infront_info.hh
@@ -8,3 +8,9 @@ GPU_SHADER_CREATE_INFO(workbench_merge_infront)
.fragment_source("workbench_merge_infront_frag.glsl")
.additional_info("draw_fullscreen")
.do_static_compilation(true);
+
+GPU_SHADER_CREATE_INFO(workbench_next_merge_depth)
+ .sampler(0, ImageType::DEPTH_2D, "depth_tx")
+ .fragment_source("workbench_next_merge_depth_frag.glsl")
+ .additional_info("draw_fullscreen")
+ .do_static_compilation(true);
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
index e7ca868a4ff..d715825c268 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_cavity_lib.glsl
@@ -5,6 +5,12 @@
/* From The Alchemy screen-space ambient obscurance algorithm
* http://graphics.cs.williams.edu/papers/AlchemyHPG11/VV11AlchemyAO.pdf */
+#ifdef WORKBENCH_CAVITY
+# define USE_CAVITY
+# define cavityJitter jitter_tx
+# define samples_coords cavity_samples.samples
+#endif
+
#ifdef USE_CAVITY
void cavity_compute(vec2 screenco,
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
index 40668e5a356..b55c627957b 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -3,6 +3,8 @@
#pragma BLENDER_REQUIRE(workbench_common_lib.glsl)
#pragma BLENDER_REQUIRE(workbench_matcap_lib.glsl)
#pragma BLENDER_REQUIRE(workbench_world_light_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_cavity_lib.glsl)
+#pragma BLENDER_REQUIRE(workbench_curvature_lib.glsl)
void main()
{
@@ -34,13 +36,49 @@ void main()
#ifdef WORKBENCH_LIGHTING_FLAT
color.rgb = base_color;
#endif
+
+#if defined(WORKBENCH_CAVITY) || defined(WORKBENCH_CURVATURE)
+ float cavity = 0.0, edges = 0.0, curvature = 0.0;
+
+# ifdef WORKBENCH_CAVITY
+ cavity_compute(uv, depth_tx, normal_tx, cavity, edges);
+ // color.rgb = vec3(cavity, edges, 0);
+# endif
+
+# ifdef WORKBENCH_CURVATURE
+ curvature_compute(uv, object_id_tx, normal_tx, curvature);
+ // color.rgb = vec3(curvature);
+# endif
+
+ float final_cavity_factor = clamp(
+ (1.0 - cavity) * (1.0 + edges) * (1.0 + curvature), 0.0, 4.0);
+
+ color.rgb *= final_cavity_factor;
+ // color.rgb *= vec3(0, 1, 0);
+
+#endif
+
color.a = 1.0f;
+ }
+
+#ifdef WORKBENCH_OUTLINE
+ vec3 offset = vec3(world_data.viewport_size_inv, 0.0) * world_data.ui_scale;
+
+ uint center_id = texture(object_id_tx, uv).r;
+ uvec4 adjacent_ids = uvec4(texture(object_id_tx, uv + offset.zy).r,
+ texture(object_id_tx, uv - offset.zy).r,
+ texture(object_id_tx, uv + offset.xz).r,
+ texture(object_id_tx, uv - offset.xz).r);
+ float outline_opacity = 1.0 - dot(vec4(equal(uvec4(center_id), adjacent_ids)), vec4(0.25));
+ color = mix(color, world_data.object_outline_color, outline_opacity);
+#endif
+
+ if (color != world_data.background_color) {
/* TODO(fclem): Port the TAA shader that does this tranformation. */
/* Use log2 space to avoid highlights creating too much aliasing. */
/* TODO(pragma37): Re-enable */
// color.rgb = log2(color.rgb + 0.5);
-
imageStore(out_color_img, texel, color);
}
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl b/source/blender/draw/engines/workbench/shaders/workbench_curvature_lib.glsl
index a6f7a1f522a..5d120560671 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_cur
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list