用户自主改进批次: - 透明窗口:GLFW_TRANSPARENT_FRAMEBUFFER + 窗口 opacity 0.5, swapchain composite alpha 按能力自适应(Opaque/Pre/PostMultiplied), Forward 清屏 alpha=0,tonemap 透传 HDR alpha——物体实体、背景透明 - 退出确认:Window 挂 WindowCloseCallback 发事件,App 侧 OnWindowClose 置确认标记,OnRenderOverlay 弹 ImGui 确认框后 Close(); 主循环退出条件改为 m_Running(close 事件驱动) - ImGui 总开关:` 键切换 ImGuiLayer::SetEnabled,禁用时跳过 NewFrame/OnRenderOverlay/BuildDrawData 整段 - 帧率控制简化:去掉 LimitFps 开关,非 vsync 时恒按 target 限帧 (默认 60,可调 ≥24);m_VSync 默认 false(Mailbox 不限速) - 清理:Model.cpp const 修正,swapchain 日志带 present mode, GPU 遥测暂时注释 验证:0 error 0 warning,composite alpha 实测选 PreMultiplied(0x2), present=Mailbox
40 lines
1.4 KiB
GLSL
40 lines
1.4 KiB
GLSL
#version 450
|
||
|
||
// Tonemap pass:HDR 线性颜色 → 显示空间。
|
||
// 这是显示变换的显式建模(对齐 UE/Unity:HDR SceneColor → tonemapper → UI)。
|
||
// ACES = Narkowicz 拟合(线性域映射到 [0,1]),可经 push constant 关闭
|
||
// 退回纯 gamma(旧观感);bloom 等后处理在 HDR 域(Tonemap 之前)插 pass。
|
||
|
||
layout(location = 0) in vec2 fragUV;
|
||
layout(location = 0) out vec4 outColor;
|
||
|
||
layout(set = 0, binding = 0) uniform sampler2D hdrImage;
|
||
layout(set = 0, binding = 1) uniform sampler2D bloomImage;
|
||
|
||
// 全屏 pass 通用 push(16B,程序级统一声明,VUID-08878)
|
||
layout(push_constant) uniform PushConstants {
|
||
float exposure; // 曝光系数
|
||
float aces; // >0.5 启用 ACES 曲线,否则纯 gamma
|
||
float bloomStrength; // bloom 叠加强度(0 = 关闭)
|
||
float _pad0;
|
||
} pc;
|
||
|
||
vec3 acesFilm(vec3 x) {
|
||
return clamp((x * (2.51 * x + 0.03)) / (x * (2.43 * x + 0.59) + 0.14), 0.0, 1.0);
|
||
}
|
||
|
||
void main() {
|
||
// bloom 在 HDR 域叠加(半分辨率模糊图线性采样上采样)
|
||
vec4 hdrTex = texture(hdrImage, fragUV);
|
||
vec3 hdr = hdrTex.rgb + texture(bloomImage, fragUV).rgb * pc.bloomStrength;
|
||
float alpha = hdrTex.a;
|
||
|
||
hdr *= pc.exposure;
|
||
|
||
vec3 mapped = (pc.aces > 0.5)
|
||
? acesFilm(hdr)
|
||
: clamp(hdr, 0.0, 1.0);
|
||
|
||
outColor = vec4(pow(mapped, vec3(1.0 / 2.2)), alpha);
|
||
}
|