feat: 透明窗口 + 实例预算扩容(修复斜光阴影静默截断)

透明窗口:SceneSettings 加 ClearColor/DrawSkybox,随 FrameSceneData
每帧下发到 SkyboxPass(替换硬编码清屏色);GLFW 透明帧缓冲已开,
tonemap 预乘 alpha 直通已有,链路全通。TAA alpha 时域混合为已知边界。

实例预算:kMaxInstances 16384 → 65536(四视图共享预算,100 实体
斜光时需求 16.4k 超限,cascade 2 实例被静默丢弃 = 用户看到的
"拖灯光方向部分背包阴影消失")。截断状态每帧落遥测 + ImGui 红字
(原 warn-once 对动态穿越阈值的场景等于没有告警)。
This commit is contained in:
2026-09-24 18:54:01 +08:00
parent fa9681aa41
commit 6df3be2846
7 changed files with 66 additions and 30 deletions
+3 -1
View File
@@ -41,7 +41,9 @@ namespace Engine::ECS {
// ---- 场景级设置 ----
struct Settings {
glm::vec4 ambientColor{0.07f, 0.07f, 0.09f, 0.0f};
glm::vec4 ClearColor = {0.1, 0.1, 0.1, 1.0};
glm::vec4 AmbientColor{0.07f, 0.07f, 0.09f, 0.0f};
bool DrawSkybox = true;
};
Settings& GetSettings() { return m_Settings; }
@@ -109,6 +109,7 @@ namespace Engine {
// 双视图剔除后的实例数(遥测)
u32 GetMainInstanceCount() const;
u32 GetShadowInstanceCount() const;
bool GetInstancesTruncated() const; // 实例预算溢出(遥测红字)
// 垂直同步开关(present mode 切换会重建 swapchain),
// 只应在帧 UI 构建段调用(Render 之前)
+12 -1
View File
@@ -33,7 +33,11 @@ namespace Engine {
};
constexpr u32 kMaxLights = 4;
constexpr u32 kMaxInstances = 16384; // 实例 SSBO 容量(矩阵数)
// 实例 SSBO 容量(矩阵数)。四视图(main + 3 级联)共享同一预算:
// 需求 = Σ各视图剔除后实例数,大场景斜光时阴影实例可膨胀到主视图
// 的 2-3 倍。65536 = 4MB/槽位,覆盖 ~800 实体 × 79 mesh 全级联;
// 再往上就该上 LOD / GPU culling,而不是继续加预算
constexpr u32 kMaxInstances = 65536;
constexpr u32 kMaxCascades = 3; // CSM 级联数
constexpr u32 kCascadeRes = 1024; // 每级联阴影图边长
@@ -69,6 +73,9 @@ namespace Engine {
struct FrameSceneData {
UniformBufferObject ubo{};
glm::vec4 ClearColor{0.1, 0.1, 0.1, 1.0};
bool DrawSkybox = true;
// 天空盒反投影矩阵:inverse(projNoJitter × mat4(mat3(view)))
//(视图去平移只留旋转 → 反投影结果即世界方向;Skybox pass push)
glm::mat4 skyInvVP{1.0f};
@@ -90,6 +97,10 @@ namespace Engine {
bool bloomEnabled = true; // BloomPass 子 pass 空转 + tonemap 强度归零
int debugView = 0; // Passes::DebugView 枚举(tonemap 路由上屏)
// 实例预算溢出(kMaxInstances):本轮收集有实例被静默丢弃——
// 必须遥测可见,"只告警一次"的大场景截断等于没有告警
bool instancesTruncated = false;
f32 collectMs = 0.0f; // 收集+剔除 CPU 耗时(遥测)
};