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. @@ _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs