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:
@@ -94,9 +94,10 @@ namespace Engine::Passes
|
||||
ZoneScopedN("Skybox");
|
||||
const vk::CommandBuffer cmd = ctx.cmd;
|
||||
|
||||
const glm::vec4& cc = m_Frame.ClearColor;
|
||||
vk::ClearValue clear;
|
||||
clear.color = vk::ClearColorValue(
|
||||
std::array<float, 4>{0.1f, 0.1f, 0.1f, 1.0f});
|
||||
std::array<float, 4>{cc.r, cc.g, cc.b, cc.a});
|
||||
|
||||
vk::RenderingAttachmentInfo color;
|
||||
color.setImageView(ctx.View(m_HDRColor))
|
||||
@@ -112,13 +113,13 @@ namespace Engine::Passes
|
||||
|
||||
cmd.beginRendering(renderingInfo);
|
||||
|
||||
if (m_Env) {
|
||||
if (m_Env && m_Frame.DrawSkybox) {
|
||||
// 无环境贴图:只清屏(Forward loadOp=Load 依赖这里先写)
|
||||
std::array<vk::ShaderStageFlagBits, 2> stages = {
|
||||
const std::array<vk::ShaderStageFlagBits, 2> stages = {
|
||||
vk::ShaderStageFlagBits::eVertex,
|
||||
vk::ShaderStageFlagBits::eFragment
|
||||
};
|
||||
std::array<vk::ShaderEXT, 2> shaders = {m_Vert, m_Frag};
|
||||
const std::array<vk::ShaderEXT, 2> shaders = {m_Vert, m_Frag};
|
||||
cmd.bindShadersEXT(stages, shaders);
|
||||
|
||||
cmd.bindDescriptorSets(vk::PipelineBindPoint::eGraphics,
|
||||
@@ -149,12 +150,12 @@ namespace Engine::Passes
|
||||
cmd.setVertexInputEXT({}, {});
|
||||
|
||||
cmd.setRasterizationSamplesEXT(vk::SampleCountFlagBits::e1);
|
||||
vk::SampleMask sampleMask = 0xFFFFFFFF;
|
||||
constexpr vk::SampleMask sampleMask = 0xFFFFFFFF;
|
||||
cmd.setSampleMaskEXT(vk::SampleCountFlagBits::e1, sampleMask);
|
||||
cmd.setAlphaToCoverageEnableEXT(VK_FALSE);
|
||||
cmd.setAlphaToOneEnableEXT(VK_FALSE);
|
||||
|
||||
vk::Viewport viewport(0.0f, 0.0f,
|
||||
const vk::Viewport viewport(0.0f, 0.0f,
|
||||
static_cast<float>(ctx.extent.width),
|
||||
static_cast<float>(ctx.extent.height),
|
||||
0.0f, 1.0f);
|
||||
@@ -170,8 +171,8 @@ namespace Engine::Passes
|
||||
.setDstAlphaBlendFactor(vk::BlendFactor::eZero)
|
||||
.setAlphaBlendOp(vk::BlendOp::eAdd);
|
||||
// ArrayProxyNoTemporaries 拒绝临时量:具名局部变量传入
|
||||
vk::Bool32 blendEnable = VK_FALSE;
|
||||
vk::ColorComponentFlags colorWriteMask =
|
||||
constexpr vk::Bool32 blendEnable = VK_FALSE;
|
||||
constexpr vk::ColorComponentFlags colorWriteMask =
|
||||
vk::ColorComponentFlagBits::eR |
|
||||
vk::ColorComponentFlagBits::eG |
|
||||
vk::ColorComponentFlagBits::eB |
|
||||
|
||||
@@ -215,6 +215,11 @@ namespace Engine
|
||||
return m_SceneRenderer->GetMainInstanceCount();
|
||||
}
|
||||
|
||||
bool Renderer::GetInstancesTruncated() const
|
||||
{
|
||||
return m_SceneRenderer->Frame().instancesTruncated;
|
||||
}
|
||||
|
||||
u32 Renderer::GetShadowInstanceCount() const
|
||||
{
|
||||
return m_SceneRenderer->GetShadowInstanceCount();
|
||||
|
||||
@@ -166,9 +166,11 @@ namespace Engine
|
||||
ubo.proj[2][1] += jy * 2.0f / static_cast<f32>(targetExtent.height);
|
||||
}
|
||||
|
||||
ubo.ambientColor = scene.GetSettings().ambientColor;
|
||||
ubo.ambientColor = scene.GetSettings().AmbientColor;
|
||||
|
||||
// ---- 运行时开关/调试视图落帧(各 pass 与 frag 只读契约字段)----
|
||||
m_Frame.ClearColor = scene.GetSettings().ClearColor;
|
||||
m_Frame.DrawSkybox = scene.GetSettings().DrawSkybox;
|
||||
m_Frame.shadowsEnabled = m_ShadowsEnabled;
|
||||
m_Frame.taaEnabled = m_TAAEnabled;
|
||||
m_Frame.bloomEnabled = m_BloomEnabled;
|
||||
@@ -363,11 +365,13 @@ namespace Engine
|
||||
m_LastProjNoJitter = ubo.projNoJitter;
|
||||
++m_FrameIndex;
|
||||
|
||||
// 截断状态每帧落遥测(ImGui 可见)——"只告警一次"的日志对
|
||||
// 大场景不够:预算是动态穿越的,用户必须实时看到截断发生
|
||||
m_Frame.instancesTruncated = instanceTruncated;
|
||||
if (instanceTruncated && !m_TruncationWarned) {
|
||||
// 只告警一次(每帧告警会刷屏)
|
||||
m_TruncationWarned = true;
|
||||
ENGINE_WARN("GPUDriven: instance buffer full ({}), entities truncated",
|
||||
kMaxInstances);
|
||||
ENGINE_WARN("GPUDriven: instance buffer full ({}), entities truncated "
|
||||
"(见 Scene Debug 面板红字)", kMaxInstances);
|
||||
}
|
||||
|
||||
m_Frame.collectMs = std::chrono::duration<f32, std::milli>(
|
||||
|
||||
Reference in New Issue
Block a user