feat: LOD 运行时开关(ImGui Features 横排,关 = 实例收集恒选 LOD0)

This commit is contained in:
2026-09-25 16:39:16 +08:00
parent a975845214
commit 8dbfb9f554
6 changed files with 23 additions and 8 deletions
+2
View File
@@ -186,6 +186,8 @@ namespace Engine
return m_SceneRenderer->Frame().bloomEnabled;
}
void Renderer::SetBloomEnabled(bool b) { m_SceneRenderer->SetBloomEnabled(b); }
bool Renderer::GetLodEnabled() const { return m_SceneRenderer->Frame().lodEnabled; }
void Renderer::SetLodEnabled(bool b) { m_SceneRenderer->SetLodEnabled(b); }
int Renderer::GetDebugView() const { return m_SceneRenderer->Frame().debugView; }
void Renderer::SetDebugView(int v) { m_SceneRenderer->SetDebugView(v); }
+10 -7
View File
@@ -174,6 +174,7 @@ namespace Engine
m_Frame.shadowsEnabled = m_ShadowsEnabled;
m_Frame.taaEnabled = m_TAAEnabled;
m_Frame.bloomEnabled = m_BloomEnabled;
m_Frame.lodEnabled = m_LodEnabled;
m_Frame.debugView = m_DebugView;
ubo.cascadeSplits.w = m_ShadowsEnabled ? 1.0f : 0.0f;
@@ -315,14 +316,16 @@ namespace Engine
const f32 worldRadius = bounds.radius * worldScale;
// LOD 选级:屏占比近似 = radius/距离(主视图按实例距离;
// 阈值 10/20 倍半径,可调)
// 阈值 10/20 倍半径,可调)。开关关闭 = 恒 LOD0
const f32 dist =
glm::length(worldCenter - camTransform->GetPosition());
u32 mainLod = 0;
if (dist >= worldRadius * 20.0f) {
mainLod = 2;
} else if (dist >= worldRadius * 10.0f) {
mainLod = 1;
if (m_LodEnabled) {
if (dist >= worldRadius * 20.0f) {
mainLod = 2;
} else if (dist >= worldRadius * 10.0f) {
mainLod = 1;
}
}
auto tryAppend = [&](ViewScratch& s, const Frustum& frustum,
@@ -361,9 +364,9 @@ namespace Engine
for (u32 c = 0; c < kMaxCascades; ++c) {
if (!cascVis[c]) continue; // 粗剔除已判不可见
// 级联降级:越远的级联覆盖范围越大,用越低的 LOD
//(阴影本来就是低频信息,误差可接受)
//(阴影本来就是低频信息,误差可接受);开关关闭 = 恒 LOD0
tryAppend(m_CascScratch[c], cascFrustum[c],
std::min(c, kMeshLodCount - 1));
m_LodEnabled ? std::min(c, kMeshLodCount - 1) : 0u);
}
}
});