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:
@@ -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 之前)
|
||||
|
||||
@@ -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 耗时(遥测)
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user