diff --git a/package/Shaders/Common/SharedData.hlsli b/package/Shaders/Common/SharedData.hlsli index 20cd92d38a..ce80da024e 100644 --- a/package/Shaders/Common/SharedData.hlsli +++ b/package/Shaders/Common/SharedData.hlsli @@ -239,7 +239,9 @@ namespace SharedData struct TerrainBlendingSettings { uint Enabled; - uint3 _padding; + float BlendStrength; + float TerrainDepthCullingDistance; + float pad0; }; cbuffer FeatureData : register(b6) diff --git a/package/Shaders/Lighting.hlsl b/package/Shaders/Lighting.hlsl index b0af696f3c..28e6a062de 100644 --- a/package/Shaders/Lighting.hlsl +++ b/package/Shaders/Lighting.hlsl @@ -997,7 +997,8 @@ PS_OUTPUT main(PS_INPUT input, bool frontFace : SV_IsFrontFace) float depthSampledLinear = SharedData::GetScreenDepth(depthSampled); float depthPixelLinear = SharedData::GetScreenDepth(input.Position.z); - blendFactorTerrain = saturate((depthSampledLinear - depthPixelLinear) / 10.0); + float blendStrength = max(SharedData::terrainBlendingSettings.BlendStrength * 10.0f, 0.001f); + blendFactorTerrain = saturate((depthSampledLinear - depthPixelLinear) / blendStrength); if (input.Position.z == depthSampled) blendFactorTerrain = 1; diff --git a/src/Features/TerrainBlending.cpp b/src/Features/TerrainBlending.cpp index dc7fee0cef..a59c0644d8 100644 --- a/src/Features/TerrainBlending.cpp +++ b/src/Features/TerrainBlending.cpp @@ -6,7 +6,9 @@ NLOHMANN_DEFINE_TYPE_NON_INTRUSIVE_WITH_DEFAULT( TerrainBlending::Settings, - Enabled) + Enabled, + BlendStrength, + TerrainDepthCullingDistance) void TerrainBlending::DrawSettings() { @@ -14,6 +16,21 @@ void TerrainBlending::DrawSettings() if (auto _tt = Util::HoverTooltipWrapper()) { ImGui::Text("Enable seamless blending between terrain and objects."); } + + ImGui::SliderFloat("Blend Strength", &settings.BlendStrength, 0.125f, 1.25f, "%.3f"); + if (auto _tt = Util::HoverTooltipWrapper()) { + ImGui::Text( + "Controls degree of blending.\n" + "Lower values create a tighter transition."); + } + + ImGui::SeparatorText("Performance Option"); + ImGui::SliderFloat("Terrain Depth Culling Distance", &settings.TerrainDepthCullingDistance, 256.0f, 8192.0f, "%.0f units"); + if (auto _tt = Util::HoverTooltipWrapper()) { + ImGui::Text( + "Skips terrain depth blending beyond this distance.\n" + "Decrease to just before blending stops to save performance."); + } } void TerrainBlending::LoadSettings(json& o_json) @@ -271,7 +288,7 @@ void TerrainBlending::Hooks::BSBatchRenderer__RenderPassImmediately::thunk(RE::B bool inTerrain = a_pass->shaderProperty && a_pass->shaderProperty->flags.all(RE::BSShaderProperty::EShaderPropertyFlag::kMultiTextureLandscape); if (inTerrain) { - if ((a_pass->geometry->worldBound.center.GetDistance(singleton.averageEyePosition) - a_pass->geometry->worldBound.radius) > 2048.0f) { + if ((a_pass->geometry->worldBound.center.GetDistance(singleton.averageEyePosition) - a_pass->geometry->worldBound.radius) > singleton.settings.TerrainDepthCullingDistance) { inTerrain = false; } } @@ -349,4 +366,4 @@ void TerrainBlending::RenderTerrainBlendingPasses() auto& mainDepth = renderer->GetDepthStencilData().depthStencils[RE::RENDER_TARGETS_DEPTHSTENCIL::kMAIN]; mainDepth.depthSRV = depthSRVBackup; -} \ No newline at end of file +} diff --git a/src/Features/TerrainBlending.h b/src/Features/TerrainBlending.h index 5c3e64b71a..c567e74c45 100644 --- a/src/Features/TerrainBlending.h +++ b/src/Features/TerrainBlending.h @@ -23,7 +23,9 @@ struct TerrainBlending : Feature struct Settings { uint32_t Enabled = true; - uint32_t pad[3]; + float BlendStrength = 1.0f; + float TerrainDepthCullingDistance = 2048.0f; + float pad0 = 0.0f; }; STATIC_ASSERT_ALIGNAS_16(Settings);