feat: 特性开关 + Pass 调试视图接口(ImGui 可控,统一帧契约)
三个运行时开关(Shadows/TAA/Bloom)与 9 种调试视图(Final/ TemporalDiff/HDR/TAAColor/Bloom/Velocity/ShadowMap0-2)。 统一设计:开关状态收敛 FrameSceneData 契约,SceneRenderer 唯一 写入、各 pass 只读(零虚接口路由);调试视图经 tonemap push int 路由已绑定的中间目标(声明超集、运行时零重绑);HDR 域 资源过同一 tonemap 保证观感可比。 - Shadows:ShadowPass lambda 空转 + frag cascadeSplits.w 短路 - TAA:alpha=0 直通 + SceneRenderer 停投影抖动(同一持有者同步) - Bloom:3 子 pass 空转 + tonemap 强度归零 - Renderer 门面 Get/Set 转发,App ImGui 3 Checkbox + Combo - PostProcessParams 瘦身为纯数值参数,showTemporalDiff 被取缔
This commit is contained in:
+65
-20
@@ -1,47 +1,92 @@
|
||||
#version 450
|
||||
|
||||
// Tonemap pass:HDR 线性颜色 → 显示空间。
|
||||
// Tonemap pass:HDR(+bloom)→ 显示空间,兼调试视图路由上屏。
|
||||
// 这是显示变换的显式建模(对齐 UE/Unity:HDR SceneColor → tonemapper → UI)。
|
||||
// ACES = Narkowicz 拟合(线性域映射到 [0,1]),可经 push constant 关闭
|
||||
// 退回纯 gamma(旧观感);bloom 等后处理在 HDR 域(Tonemap 之前)插 pass。
|
||||
// 退回纯 gamma(旧观感)。
|
||||
//
|
||||
// 调试视图:pc.debugView 整型路由到已绑定的中间目标(绑定超集静态成立,
|
||||
// 运行时零重绑)。HDR 域资源过同一套 exposure/tonemap 保证观感可比;
|
||||
// LDR 类(velocity/深度)直接可视化。
|
||||
|
||||
layout(location = 0) in vec2 fragUV;
|
||||
layout(location = 0) out vec4 outColor;
|
||||
|
||||
layout(set = 0, binding = 0) uniform sampler2D hdrImage;
|
||||
layout(set = 0, binding = 0) uniform sampler2D taaImage; // TAA 后 HDR(主输入)
|
||||
layout(set = 0, binding = 1) uniform sampler2D bloomImage;
|
||||
layout(set = 0, binding = 2) uniform sampler2D temporalDiffImage; // 帧历史差异(调试视图)
|
||||
layout(set = 0, binding = 2) uniform sampler2D temporalDiffImage;
|
||||
layout(set = 0, binding = 3) uniform sampler2D rawHdrImage; // Forward 直出(TAA 前)
|
||||
layout(set = 0, binding = 4) uniform sampler2D velocityImage;
|
||||
layout(set = 0, binding = 5) uniform sampler2D shadowMap0Image; // D32 深度(r 分量)
|
||||
layout(set = 0, binding = 6) uniform sampler2D shadowMap1Image;
|
||||
layout(set = 0, binding = 7) uniform sampler2D shadowMap2Image;
|
||||
|
||||
// 与 Passes::DebugView 枚举同步(FullscreenGpu.h)
|
||||
const int VIEW_FINAL = 0;
|
||||
const int VIEW_TEMPORALDIFF = 1;
|
||||
const int VIEW_RAW_HDR = 2;
|
||||
const int VIEW_TAA = 3;
|
||||
const int VIEW_BLOOM = 4;
|
||||
const int VIEW_VELOCITY = 5;
|
||||
const int VIEW_SHADOW0 = 6;
|
||||
const int VIEW_SHADOW1 = 7;
|
||||
const int VIEW_SHADOW2 = 8;
|
||||
|
||||
// 全屏 pass 通用 push(16B,程序级统一声明,VUID-08878)
|
||||
layout(push_constant) uniform PushConstants {
|
||||
float exposure; // 曝光系数
|
||||
float aces; // >0.5 启用 ACES 曲线,否则纯 gamma
|
||||
float bloomStrength; // bloom 叠加强度(0 = 关闭)
|
||||
float debugView; // >0.5 显示帧历史差异视图(TemporalDiff)
|
||||
float debugView; // 调试视图枚举(整型经 float 传)
|
||||
} 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);
|
||||
}
|
||||
|
||||
vec3 tonemap(vec3 hdr) {
|
||||
hdr *= pc.exposure;
|
||||
vec3 mapped = (pc.aces > 0.5) ? acesFilm(hdr) : clamp(hdr, 0.0, 1.0);
|
||||
return pow(mapped, vec3(1.0 / 2.2));
|
||||
}
|
||||
|
||||
// 深度可视化:反相(近=白,与调试截图风格一致)
|
||||
vec3 depthView(sampler2D depthImage) {
|
||||
float d = texture(depthImage, fragUV).r;
|
||||
return vec3(pow(1.0 - d, 2.2));
|
||||
}
|
||||
|
||||
void main() {
|
||||
// 调试视图:帧历史差异(静止=黑,运动边缘发光)
|
||||
if (pc.debugView > 0.5) {
|
||||
vec3 d = clamp(texture(temporalDiffImage, fragUV).rgb, 0.0, 1.0);
|
||||
outColor = vec4(pow(d, vec3(1.0 / 2.2)), 1.0);
|
||||
return;
|
||||
int view = int(pc.debugView + 0.5);
|
||||
|
||||
// ---- 调试视图路由 ----
|
||||
if (view != VIEW_FINAL) {
|
||||
switch (view) {
|
||||
case VIEW_TEMPORALDIFF: {
|
||||
// 帧历史差异:静止=黑,运动边缘发光
|
||||
vec3 d = clamp(texture(temporalDiffImage, fragUV).rgb, 0.0, 1.0);
|
||||
outColor = vec4(pow(d, vec3(1.0 / 2.2)), 1.0);
|
||||
return;
|
||||
}
|
||||
case VIEW_RAW_HDR: outColor = vec4(tonemap(texture(rawHdrImage, fragUV).rgb), 1.0); return;
|
||||
case VIEW_TAA: outColor = vec4(tonemap(texture(taaImage, fragUV).rgb), 1.0); return;
|
||||
case VIEW_BLOOM: outColor = vec4(tonemap(texture(bloomImage, fragUV).rgb * 4.0), 1.0); return;
|
||||
case VIEW_VELOCITY: {
|
||||
// |velocity| × 增益:静止=黑,运动越快越亮
|
||||
vec2 vel = texture(velocityImage, fragUV).xy;
|
||||
float mag = clamp(length(vel) * 8.0, 0.0, 1.0);
|
||||
outColor = vec4(vec3(mag), 1.0);
|
||||
return;
|
||||
}
|
||||
case VIEW_SHADOW0: outColor = vec4(depthView(shadowMap0Image), 1.0); return;
|
||||
case VIEW_SHADOW1: outColor = vec4(depthView(shadowMap1Image), 1.0); return;
|
||||
case VIEW_SHADOW2: outColor = vec4(depthView(shadowMap2Image), 1.0); return;
|
||||
}
|
||||
}
|
||||
|
||||
// bloom 在 HDR 域叠加(半分辨率模糊图线性采样上采样)
|
||||
vec4 hdrTex = texture(hdrImage, fragUV);
|
||||
// ---- 正常路径:TAA 后 HDR + bloom 叠加 → tonemap ----
|
||||
vec4 hdrTex = texture(taaImage, 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, alpha);
|
||||
outColor = vec4(tonemap(hdr) * hdrTex.a, hdrTex.a);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user