From 07d7bc95e35bb90f9ef5b2db8b38c30749098918 Mon Sep 17 00:00:00 2001 From: Haroon Qureshi Date: Thu, 26 Feb 2026 08:22:54 -0800 Subject: [PATCH] Expose vsm blur width parameter. PiperOrigin-RevId: 875733943 Change-Id: Ic8cb423104d2e62ce295f6a2ab6fd67d548910a6 --- src/experimental/filament/filament/light.cc | 5 +++++ src/experimental/filament/filament/light.h | 2 ++ src/experimental/filament/filament/scene_view.cc | 3 +++ src/experimental/filament/filament/scene_view.h | 1 + 4 files changed, 11 insertions(+) diff --git a/src/experimental/filament/filament/light.cc b/src/experimental/filament/filament/light.cc index d26fd370..e0c090f7 100644 --- a/src/experimental/filament/filament/light.cc +++ b/src/experimental/filament/filament/light.cc @@ -72,6 +72,11 @@ Light::Light(ObjectManager* object_mgr, const Params& params) type == filament::LightManager::Type::DIRECTIONAL ? 4 : 1; opts.shadowBulbRadius = params.bulbradius; opts.mapSize = params.shadow_map_size; + if (params.vsm_blur_width > 0.0f) { + opts.vsm.elvsm = true; + opts.vsm.blurWidth = params.vsm_blur_width; + } + builder.shadowOptions(opts); entity_ = utils::EntityManager::get().create(); diff --git a/src/experimental/filament/filament/light.h b/src/experimental/filament/filament/light.h index 64dc0b8c..d32237eb 100644 --- a/src/experimental/filament/filament/light.h +++ b/src/experimental/filament/filament/light.h @@ -45,6 +45,8 @@ class Light { float bulbradius = 0.0f; // The size of the shadow map. int shadow_map_size = 2048; + // Blur width for EL VSM. + float vsm_blur_width = 0.0f; // Whether or not the light is a headlight. bool headlight = false; }; diff --git a/src/experimental/filament/filament/scene_view.cc b/src/experimental/filament/filament/scene_view.cc index 3b25faaf..e30c342c 100644 --- a/src/experimental/filament/filament/scene_view.cc +++ b/src/experimental/filament/filament/scene_view.cc @@ -134,6 +134,8 @@ SceneView::SceneView(filament::Engine* engine, ObjectManager* object_mgr) default_shadow_map_size_ = ReadElement( m, "filament.shadows.map_size", default_shadow_map_size_); + default_vsm_blur_width_ = ReadElement( + m, "filament.shadows.vsm_blur_width", default_vsm_blur_width_); auto shadow_type = views_[kNormalIndex]->getShadowType(); shadow_type = ReadElement(m, "filament.shadows.type", shadow_type); @@ -298,6 +300,7 @@ void SceneView::PrepareLights() { params.range = model->light_range[i]; params.intensity = model->light_intensity[i]; params.shadow_map_size = default_shadow_map_size_; + params.vsm_blur_width = default_vsm_blur_width_; if (params.type == mjLIGHT_SPOT) { params.spot_cone_angle = model->light_cutoff[i]; } diff --git a/src/experimental/filament/filament/scene_view.h b/src/experimental/filament/filament/scene_view.h index 94d1ac9a..4e746ce8 100644 --- a/src/experimental/filament/filament/scene_view.h +++ b/src/experimental/filament/filament/scene_view.h @@ -101,6 +101,7 @@ class SceneView { DrawMode active_mode_ = DrawMode::kNumDrawModes; float aspect_ratio_ = 1.0f; int default_shadow_map_size_ = 2048; + float default_vsm_blur_width_ = 0.0f; float fallback_head_light_intensity_ = 0.f; float fallback_scene_light_intensity_ = 80'000.f; float fallback_environment_light_intensity_ = 5'000.f;