feat: ACES tonemap + Bloom 后处理链(Extract/BlurH/BlurV 半分辨率)
- ACES(Narkowicz) 经 push 开关启用,exposure 接 ImGui 滑条 - RG: TextureDesc 支持 sizeScale 相对尺寸;per-pass 渲染尺寸解析 (半分辨率 pass 的 viewport 由此决定) - RG Toposort 重写:RAW+WAR+WAW 按声明序逐资源建边,支持多写者 ping-pong 资源(旧逻辑对 reader 连接所有 writer,ping-pong 成环) - GetPhysicalView 缺物理镜像时 throw(ENGINE_FATAL 只记日志不中止) - 全屏 pass 通用 16B push + 公共录制 lambda,Extract/Blur/Tonemap 复用
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
#version 450
|
||||
|
||||
// Bloom 提取:从 HDR 颜色图中滤出超过阈值的部分(软阈值,保留超出比例)。
|
||||
// 全屏 pass 通用 push(16B):param0 = 亮度阈值(HDR 域,1.0 = 仅高光溢出)。
|
||||
|
||||
layout(location = 0) in vec2 fragUV;
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D hdrImage;
|
||||
|
||||
layout(push_constant) uniform PushConstants {
|
||||
float exposure; // 未用(程序级统一布局)
|
||||
float threshold; // param0
|
||||
float _pad0;
|
||||
float _pad1;
|
||||
} pc;
|
||||
|
||||
void main() {
|
||||
vec3 c = texture(hdrImage, fragUV).rgb;
|
||||
float l = max(c.r, max(c.g, c.b));
|
||||
|
||||
// 软阈值:只保留超出 threshold 的能量比例,避免硬切产生的块状边缘
|
||||
float k = max(l - pc.threshold, 0.0) / max(l, 1e-4);
|
||||
outColor = vec4(c * k, 1.0);
|
||||
}
|
||||
Reference in New Issue
Block a user