[Bf-blender-cvs] [5abcd8c8fbc] tmp-workbench-rewrite2: transparency/xray mode
Miguel Pozo
noreply at git.blender.org
Tue Oct 18 20:06:11 CEST 2022
Commit: 5abcd8c8fbc2d05194f3f8d375e9154f0be6c603
Author: Miguel Pozo
Date: Tue Oct 18 20:00:50 2022 +0200
Branches: tmp-workbench-rewrite2
https://developer.blender.org/rB5abcd8c8fbc2d05194f3f8d375e9154f0be6c603
transparency/xray mode
===================================================================
M source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
M source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
M source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
M source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
M source/blender/draw/engines/workbench/workbench_engine.cc
M source/blender/draw/engines/workbench/workbench_materials.cc
M source/blender/draw/engines/workbench/workbench_mesh_passes.cc
M source/blender/draw/engines/workbench/workbench_private.h
M source/blender/draw/engines/workbench/workbench_private.hh
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/engines/workbench/shaders/infos/workbench_prepass_info.hh b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
index 89dcfda3eda..5a66846a4cb 100644
--- a/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
+++ b/source/blender/draw/engines/workbench/shaders/infos/workbench_prepass_info.hh
@@ -86,6 +86,10 @@ GPU_SHADER_CREATE_INFO(workbench_lighting_matcap)
.sampler(4, ImageType::FLOAT_2D, "matcap_diffuse_tx", Frequency::PASS)
.sampler(5, ImageType::FLOAT_2D, "matcap_specular_tx", Frequency::PASS);
+GPU_SHADER_CREATE_INFO(workbench_next_lighting_matcap)
+ .define("WORKBENCH_LIGHTING_MATCAP")
+ .sampler(WB_MATCAP_SLOT, ImageType::FLOAT_2D_ARRAY, "matcap_tx", Frequency::PASS);
+
/** \} */
/* -------------------------------------------------------------------- */
@@ -232,7 +236,7 @@ GPU_SHADER_CREATE_INFO(workbench_matcap).define("WORKBENCH_SHADING_MATCAP");
#define WORKBENCH_SHADING_VARIATIONS(prefix, ...) \
WORKBENCH_COLOR_VARIATIONS(prefix##_flat, "workbench_lighting_flat", __VA_ARGS__) \
WORKBENCH_COLOR_VARIATIONS(prefix##_studio, "workbench_lighting_studio", __VA_ARGS__) \
- WORKBENCH_COLOR_VARIATIONS(prefix##_matcap, "workbench_lighting_matcap", __VA_ARGS__)
+ WORKBENCH_COLOR_VARIATIONS(prefix##_matcap, "workbench_next_lighting_matcap", __VA_ARGS__)
#define WORKBENCH_PIPELINE_VARIATIONS(prefix, ...) \
WORKBENCH_SHADING_VARIATIONS(prefix##_transparent, "workbench_transparent_accum", __VA_ARGS__) \
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 e3a68ec6153..40668e5a356 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_composite_comp.glsl
@@ -35,11 +35,12 @@ void main()
color.rgb = base_color;
#endif
color.a = 1.0f;
- }
- /* TODO(fclem): Port the TAA shader that does this tranformation. */
- /* Use log2 space to avoid highlights creating too much aliasing. */
- color = log2(color + 0.5);
+ /* 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);
+ imageStore(out_color_img, texel, color);
+ }
}
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
index 8b9e3f968ea..3cf9ee98aa9 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_effect_smaa_frag.glsl
@@ -25,7 +25,8 @@ void main()
}
out_color /= taaAccumulatedWeight;
/* Exit log2 space used for Antialiasing. */
- out_color = exp2(out_color) - 0.5;
+ /* TODO(pragma37): Re-enable */
+ // out_color = exp2(out_color) - 0.5;
/* Avoid float precision issue. */
if (out_color.a > 0.999) {
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
index beb361df4a4..d43f2ec4d3d 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_accum_frag.glsl
@@ -44,6 +44,8 @@ float calculate_transparent_weight(void)
return clamp(w, 1e-2, 3e2);
}
+#ifdef WORKBENCH_NEXT
+
void main()
{
/* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
@@ -53,21 +55,59 @@ void main()
vec3 color = color_interp;
-#ifdef WORKBENCH_COLOR_TEXTURE
+# ifdef WORKBENCH_COLOR_TEXTURE
color = workbench_image_color(uv_interp);
-#endif
+# endif
+
+# ifdef WORKBENCH_LIGHTING_MATCAP
+ vec3 shaded_color = get_matcap_lighting(matcap_tx, color, N, I);
+# endif
+
+# ifdef WORKBENCH_LIGHTING_STUDIO
+ vec3 shaded_color = get_world_lighting(color, _roughness, metallic, N, I);
+# endif
+
+# ifdef WORKBENCH_LIGHTING_FLAT
+ vec3 shaded_color = color;
+# endif
+
+ // shaded_color *= get_shadow(N, forceShadowing);
+
+ /* Listing 4 */
+ float alpha = alpha_interp * world_data.xray_alpha;
+ float weight = calculate_transparent_weight() * alpha;
+ out_transparent_accum = vec4(shaded_color * weight, alpha);
+ out_revealage_accum = vec4(weight);
+
+ out_object_id = uint(object_id);
+}
+
+#else
-#ifdef WORKBENCH_LIGHTING_MATCAP
+void main()
+{
+ /* Normal and Incident vector are in viewspace. Lighting is evaluated in viewspace. */
+ vec2 uv_viewport = gl_FragCoord.xy * world_data.viewport_size_inv;
+ vec3 I = get_view_vector_from_screen_uv(uv_viewport);
+ vec3 N = normalize(normal_interp);
+
+ vec3 color = color_interp;
+
+# ifdef WORKBENCH_COLOR_TEXTURE
+ color = workbench_image_color(uv_interp);
+# endif
+
+# ifdef WORKBENCH_LIGHTING_MATCAP
vec3 shaded_color = get_matcap_lighting(matcap_diffuse_tx, matcap_specular_tx, color, N, I);
-#endif
+# endif
-#ifdef WORKBENCH_LIGHTING_STUDIO
+# ifdef WORKBENCH_LIGHTING_STUDIO
vec3 shaded_color = get_world_lighting(color, _roughness, metallic, N, I);
-#endif
+# endif
-#ifdef WORKBENCH_LIGHTING_FLAT
+# ifdef WORKBENCH_LIGHTING_FLAT
vec3 shaded_color = color;
-#endif
+# endif
shaded_color *= get_shadow(N, forceShadowing);
@@ -78,3 +118,5 @@ void main()
out_object_id = uint(object_id);
}
+
+#endif
diff --git a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
index 35bea830bac..b0d082cdf97 100644
--- a/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
+++ b/source/blender/draw/engines/workbench/shaders/workbench_transparent_resolve_frag.glsl
@@ -16,4 +16,9 @@ void main()
/* Listing 4 */
fragColor.rgb = trans_accum.rgb / clamp(trans_weight, 1e-4, 5e4);
fragColor.a = 1.0 - trans_reveal;
+
+ /* TODO(fclem): Port the TAA shader that does this tranformation. */
+ /* Use log2 space to avoid highlights creating too much aliasing. */
+ /* TODO(pragma37): Re-enable */
+ // fragColor.rgb = log2(fragColor.rgb + 0.5);
}
diff --git a/source/blender/draw/engines/workbench/workbench_engine.cc b/source/blender/draw/engines/workbench/workbench_engine.cc
index 2a2ead29a17..b32688c3092 100644
--- a/source/blender/draw/engines/workbench/workbench_engine.cc
+++ b/source/blender/draw/engines/workbench/workbench_engine.cc
@@ -36,10 +36,11 @@ class Instance {
public:
SceneResources resources;
- OpaquePass opaque_ps;
-
- // TransparentPass transparent_ps;
- // TransparentPass transparent_in_front_ps;
+ OpaquePass opaque_ps = OpaquePass(resources.color_tx, resources.depth_tx);
+ OpaquePass opaque_in_front_ps = OpaquePass(resources.color_tx, resources.depth_in_front_tx);
+ TransparentPass transparent_ps = TransparentPass(resources.color_tx, resources.depth_tx);
+ TransparentPass transparent_in_front_ps = TransparentPass(resources.color_tx,
+ resources.depth_in_front_tx);
AntiAliasingPass anti_aliasing_ps;
@@ -58,6 +59,7 @@ class Instance {
eContextObjectMode ob_mode;
View3DShading shading;
+ bool xray_mode;
StringRefNull current_matcap;
Scene *scene;
@@ -123,6 +125,9 @@ class Instance {
shading.xray_alpha = 1.0f;
}
}
+ world_buf.xray_alpha = shading.xray_alpha;
+
+ xray_mode = !is_render_mode && shading.xray_alpha != 1.0f;
if (SHADING_XRAY_FLAG_ENABLED(shading)) {
/* Disable shading options that aren't supported in transparency mode. */
@@ -136,8 +141,6 @@ class Instance {
shading_type = shading_type_from_v3d_lighting(shading.light);
material_override = Material(shading.single_color);
- UniformBuffer<WorldData> &world_buf = resources.world_buf;
-
StudioLight *studio_light = nullptr;
if (U.edit_studio_light) {
studio_light = BKE_studiolight_studio_edit_get();
@@ -194,6 +197,7 @@ class Instance {
/* TODO(pragma37) volumes_do */
resources.depth_tx.ensure_2d(GPU_DEPTH24_STENCIL8, output_res);
+ resources.depth_in_front_tx.ensure_2d(GPU_DEPTH24_STENCIL8, output_res);
anti_aliasing_ps.init(reset_taa);
/* TODO(pragma37) taa_sample_len */
@@ -202,9 +206,13 @@ class Instance {
void begin_sync()
{
resources.world_buf.push_update();
+
opaque_ps.sync(cull_state, clip_state, shading_type, resources);
- // transparent_ps.sync(cull_state, clip_state, shading_type, resources);
- // transparent_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
+ opaque_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
+
+ transparent_ps.sync(cull_state, clip_state, shading_type, resources);
+ transparent_in_front_ps.sync(cull_state, clip_state, shading_type, resources);
+
anti_aliasing_ps.sync(resources);
}
@@ -438,13 +446,18 @@ class Instance {
if (batches[i] == nullptr) {
continue;
}
-
/* TODO(fclem): This create a cull-able instance for each sub-object. This is done
* for simplicity to reduce complexity. But this increase the overhead per object.
* Instead, we should use an indirection buffer to the material buffer. */
- ::Material *mat = BKE_object_material_get_eval(ob_ref.object, i + 1);
- if (mat == nullptr) {
- mat = BKE_material_default_empty();
+
+ ResourceHandle handle = manager.resource_handle(ob_ref);
+ Material &mat = resources.material_buf.get_or_resize(handle.resource_index());
+
+ if (::Material *_mat = BKE_object_material_get_eval(ob_ref.object, i + 1)) {
+ mat = Material(*_mat);
+ }
+ else {
+ mat = Material(*BKE_material_default_empty());
}
::Image *
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list