屏幕扰动
全库目录221
本文目录6
热浪让背景扭曲,但屏幕颜色只包含已绘制内容。屏幕扰动把偏移场变成UV,采样场景快照再合成。执行时机、深度拒绝与源目标分离决定边缘是否会吸入错误前景。
屏幕扰动与折射
屏幕扰动通常采样场景颜色:
可由法线/噪声的 RG 映射到 , 是强度。
需要限制偏移,避免采到物体轮廓外的错误前景。场景颜色只包含已经渲染的内容,因此执行时机、透明队列和相机堆叠都会改变结果。
真正物理折射还涉及 IOR、厚度和入射方向。简单屏幕偏移只是视觉近似,在屏幕边缘和遮挡关系上天然缺信息。
偏移采样
HLSL片段输入offset无单位UV,source是一份可采样快照,不能同时写同一子资源。
float2 sampleUv = clamp(uv + offset, validMinUv, validMaxUv);
float3 color = SceneColor.SampleLevel(LinearClamp, sampleUv, 0).rgb;前景拒绝
偏移坐标处若是位于扰动面之前的栏杆,直接采样会把栏杆颜色拉到背景里。先在候选 UV 读取深度并线性化,和该采样方向下扰动面的观察深度比较;前景样本退回原 UV。对于近似平面的小偏移,可以用当前片元深度近似,曲面或大偏移则需要重建采样射线与扰动面的关系。
candidateUV = clamp(uv + offsetPixels / renderSize, validMinUV, validMaxUV)
candidateDepth = LinearDepth(SceneDepth(candidateUV))
if candidateDepth < distortionDepthAt(candidateUV) - tolerance:
candidateUV = uv
color = SceneColorSnapshot(candidateUV)例如平面扰动面观察深度5米,候选UV下栏杆深度3米,容差0.01米,3小于4.99,必须退回原UV;若候选背景在8米,则可以采用。平面假设失效时,当前片元的5米不再代表候选射线的扰动面位置,误拒绝和漏拒绝都会出现。
distortionDepthAt 是几何查询接口,平面可做射线平面求交;代码不假装屏幕深度包含这份表面。像素偏移除以实际渲染尺寸,动态分辨率改变时才能保持约定的纹素尺度。边界限制范围只保证坐标合法,会把边缘颜色拉长;可以把接近屏幕边缘的扰动权重淡出,避免把缺失屏外内容显示成一条色带。
验证方法
把扰动强度设为零,与原图一致;在物体边缘、屏幕外和不同透明顺序检查缺失。真实折射还涉及IOR、厚度与遮挡,屏幕偏移只提供视觉近似。
实现状态:正文片段用于解释本页数据流与边界条件;完整宿主的编译、运行及性能测量尚未执行。可运行的独立模型以本页列出的具体测试为准。
相关主题
参考资料
- PBRT 4e §9.3:Specular Reflection and Transmission:Snell 定律的介质与方向约束;屏幕偏移和前景拒绝是本文明示的视觉近似。