feat: LOD 运行时开关(ImGui Features 横排,关 = 实例收集恒选 LOD0)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user