中EN
概念页

图像处理与后处理

Image Processing & Post-Processing

后处理是在渲染出图像后再用 GPU 对其做图像处理:把离屏缓冲当纹理,用全屏 pass 让像素着色器(或计算着色器)对每个像素采样邻域并加权求和。核心技巧包括可分离滤波、利用双线性插值减少采样、降采样、以及借助深度/法线保持边缘的(联合)双边滤波(RTR4 12.1 节)。

全屏 pass

  • 场景先渲染到离屏的颜色和/或深度缓冲,再作为纹理贴到覆盖全屏的图元上,使像素着色器对每个像素执行一次。一帧可能有大量这样的 pass,例如《战地 4》有五十多种渲染 pass(并非每帧都用)。
  • 用一个足够大的全屏三角形代替两个三角形组成的四边形更高效:在 AMD GCN 上因缓存一致性更好,快近 10%。
  • 也可用计算着色器做图像处理,滤波核越大优势越明显:线程组共享内存可在像素间共享读取,降低带宽。

滤波核

  • 每个邻居的贡献按其相对位置加权求和;边缘检测等用固定邻域(如 3×3)且权重可为负。
  • 旋转不变滤波核的权重只取决于到中心的距离,如 sinc 和高斯:

Gaussian(x)=1σ2πe−r22σ2\mathrm{Gaussian}(x)=\frac{1}{\sigma\sqrt{2\pi}}e^{-\frac{r^2}{2\sigma^2}}

rr 为到纹素中心的距离,σ\sigma 为标准差(σ2\sigma^2 为方差)。经验法则:支撑宽度起码取 3σ3\sigma 像素,更宽则更模糊但内存访问更多。离散核会把权重归一化到和为 1,所以前面的常数可以省略。sinc 和高斯都无限延伸,实际截断到一定直径或方形区域。σ=1 的 5×5 高斯核中心权重为 0.1621。

  • 屏幕边缘会采样到不存在的纹素:可把采样器设为 clamp to edge(边缘有误差但通常不明显),或以略高于显示区的分辨率渲染。

减少采样的技巧

技巧做法效果
双线性"一次取多纹素"一次双线性采样可得到最多四个纹素的加权和;3×3 盒式滤波只需 4 次采样。权重不等时把采样点放在两纹素之间并偏向权重大的一侧,如权重 0.01 与 0.04,采样点距前者 0.8、距后者 0.2,该样本权重 0.05采样数大减
可分离滤波高斯、盒式可拆成水平与竖直两个一维滤波,代价从 d2d^2 降到 2d2d;5×5 从 25 次变成 10 次核越宽收益越大
复数可分离圆盘圆盘核(散景)在实数域不可分离,借助复数可得一族可分离函数 (Wronski)低成本圆形模糊
移动平均计算着色器 + 分散写入:每行/列首像素算完整核,之后每步加上前沿样本、减去离开的样本任意半径盒式滤波常数代价,可近似任意大小的高斯
降采样在半分辨率(四分之一像素数)图像上处理,放大时双线性再带来模糊;小图上宽 5 的核约等于原图宽 9访问量大减,大片相近颜色时伪影很少;也可减少每像素位数,许多粒子可半分辨率渲染,或建 mipmap 多层采样

双边滤波

  • 丢弃或削弱看起来与中心样本表面无关的样本,以保持边缘。例:对焦在红色物体上,背景蓝色物体应模糊而红色保持清晰——只用非红色样本模糊,并按实际使用的权重和归一化(书中例子权重和为 0.8755)。
  • 联合(交叉)双边滤波用深度、法线、ID、速度等额外数据判断邻居是否可用。Ownby 等对少样本阴影贴图的结果做模糊,并按深度剔除其他表面的样本,避免阴影渗到别的物体。这种降低区域变化的操作称降噪,SSAO 中常用。
  • 只用深度不够:软阴影跨过立方体两个面的棱时深度连续,会渗到背光面;同时比较深度和法线即可,因此也叫边缘保持滤波。如何削弱邻居取决于模型、算法和观察条件。
  • 代价:可分离两遍和双线性合并采样都难用(事先不知哪些样本要丢),不过因可分离太划算,已有近似做法;严格说双边滤波不可分离(每像素样本数可变),当作可分离处理的伪影常被其他着色效果掩盖。
  • 上采样:Yang 等低分辨率着色,再用法线和深度做双边上采样;最近深度滤波取低分辨率四个样本中深度最接近高分辨率深度的那个。低分辨率渲染会丢失细节,Herzog 等借助时间相干和重投影改进。

管线组织

  • 乒乓缓冲:两个离屏缓冲轮流作为输入和输出,中间结果是临时 (transient) 资源;管理和复用临时资源是现代渲染系统设计的关键。
  • 每个效果一个 pass 架构上方便,但为了效率最好把尽可能多的效果合并进一个 pass。
  • 常见效果:热成像、胶片颗粒、色差、边缘检测、热浪扭曲、涟漪、色调分离、辅助云渲染等,很多只需颜色图像作输入。

GEA 的视角:全屏后期效果(卷 II 12.7)

  • 场景画进帧缓冲后,在视频硬件扫描输出之前通常还要做一系列后处理(卷 II 12.7)。
  • 全屏后期效果给 3D 场景增加真实感或风格化外观,通常把整个屏幕内容送进一个像素着色器:画一个全屏四边形,贴上未经滤波的场景纹理(卷 II 12.7.2)。这与本页「全屏 pass」一致。GEA 列举的例子:
    • 运动模糊:渲染屏幕空间速度向量缓冲,用这个向量场有选择地模糊图像;模糊用卷积核在图像上滑过实现(GEA 推荐 Dale A. Schumacher 的《Image Smoothing and Sharpening by Discrete Convolution》,收录于 Graphics Gems II)(见 运动模糊)。
    • 景深模糊:用深度缓冲的内容调整每个像素的模糊程度(见 景深)。
    • 暗角 (vignette):降低屏幕角落的亮度或饱和度,有时直接在屏幕上叠一张纹理;它的变体用来做望远镜或狙击镜的圆形视野。
    • 调色 (colorization):任意改变像素颜色,例如把红色以外都去饱和成灰色,效果类似《辛德勒的名单》里穿红衣的小女孩。
    • SSAO(见 环境光遮蔽)。
  • HDR 与色调映射也被 GEA 归入后处理,见 色调映射。降噪同样是一个后处理步骤,见 随机光线追踪与路径追踪。
  1. realtime_rendering_4ed.pdf 第 12 章 Image-Space Effects
  2. Game_Engine_Architecture_4th_Edtion_Volume_2_-_Jason_Gregory.pdf
  3. Jason Gregory《Game Engine Architecture》第 4 版(2026)卷 II 第 12 章 12.7 节

相关页面

图形学泛光与镜头光晕Bloom & Lens Flare镜头光晕是光经镜头系统或眼睛的间接反射等非预期路径产生的现象;泛光 (bloom) 是镜头和眼睛中的散射在亮光周围形成辉光、并降低其他地方对比度。显示器亮度有限,加入这些眩光效果可以暗示更高的亮度。实现上,光晕常用随光源位置变化的公告板或对亮部做图像处理,泛光则是"提取亮部 → 降采样模糊 → 加回原图"(RTR4 12.3 节)。图形学景深Depth of Field相机在给定设置下只有一段深度范围清晰,范围外的物体越远离越模糊。实时渲染默认是完美对焦的针孔相机,所以"景深"指对近景和远景做模糊。实用算法从单张图像出发,按深度算出每像素的弥散圆半径,分离近景与其余部分分别模糊再合成;"边收集边散布"和对高亮像素单独溅射散景是游戏中的常见做法(RTR4 12.4 节)。图形学运动模糊Motion Blur运动模糊可看作时间域的抗锯齿:快门打开期间物体或相机的相对运动在画面上拖出模糊,没有它快速运动的物体会在帧间"跳跃"。实时做法以速度缓冲为核心,用"边收集边散布"思路:按瓦片求最大速度、扩展到邻域,再沿速度方向对每个像素采样并处理遮挡。游戏中还需考虑玩家控制下的视角,常只对物体或平移做模糊(RTR4 12.5 节)。图形学时间重投影Temporal Reprojection重投影是在新的视点和朝向下复用前几帧已计算的样本。目的一是利用时间相干把渲染开销摊到多帧(与时间抗锯齿相关),二是当前帧来不及完成时快速生成近似帧(对 VR 防止晕动尤其重要)。分为反向重投影(从上一帧收集)和正向重投影(把上一帧散布到当前帧)(RTR4 12.2 节)。图形学计算着色器Compute Shader计算着色器是 DirectX 11 引入的一种 GPU 计算方式:它不固定在图形管线的某个位置,但由图形 API 调用,和其他着色器共用统一着色器核心。它暴露了线程组和组内共享内存,最大的优势是能直接处理 GPU 上生成的数据,不用来回传给 CPU。图形学像素着色器Pixel Shader像素着色器(OpenGL 里叫片元着色器)对光栅化产生的每个片元运行,用插值后的顶点数据算出颜色,也可以输出不透明度、修改深度或直接丢弃片元。多渲染目标让它一次输出多组数据,催生了延迟着色。它通常只能写自己所在的像素,但能通过 2×2 quad 拿到相邻像素的导数。图形学环境光遮蔽Ambient Occlusion环境光遮蔽 (AO) 是余弦加权后半球上未被遮挡的比例,用来在光照缺乏方向变化时仍给出形状线索(缝隙变暗)。它由 Landis 在 ILM 为《珍珠港》开发,可离线烘焙,也可在物体空间或屏幕空间动态计算(SSAO、HBAO、GTAO 等)。AO 适合漫反射和平滑环境光,不适合点光源或小面光源的可见性(RTR4 11.3 节)。图形学抗锯齿Antialiasing渲染本质上是采样,采样频率不足就会混叠(锯齿、闪烁的"萤火虫"、车轮倒转)。屏幕空间抗锯齿在每个像素取多个样本并加权求和:超采样最直接但最贵,MSAA 每像素只着色一次,时间抗锯齿 (TAA) 把样本分散到多帧,形态学方法 (FXAA/SMAA) 作为后处理重建边缘。没有一种方法在所有方面最好。图形学雾与简易体积光照Fog & Simple Volumetric Lighting这类"老派"技巧依赖经验模型,但至今仍然好用:深度雾、高度雾和局部雾体积用透射率混合雾色;光柱可用拉伸的面向相机粒子、单次散射的解析积分、平面切片,或屏幕空间径向模糊实现(RTR4 14.2 节)。图形学实时次表面散射Real-Time Subsurface Scattering蜡、皮肤、牛奶等高散射固体中,光在离入射点不远处重新射出;当偏移大于一个像素时就不能再用 BRDF 表示。实时方法从便宜的包裹光照、法线模糊、预积分皮肤,到纹理空间/屏幕空间扩散,再到针对大尺度散射的深度图技术(RTR4 14.6 节)。图形学图像空间边缘检测Image-Space Edge Detection不碰场景几何,只对渲染出的深度、法线、物体 ID 等缓冲(G-buffer)做图像处理来找出描边位置,再用形态学算子加粗、与着色结果合成。它对任何表面都适用、不要求网格连通,是游戏中最常见的描边方式之一;缺点是边的判定需要按内容调参,可能漏检或误检。游戏开发 · UE5TSR 与抗锯齿方案Temporal Super Resolution & Anti-AliasingUE5 提供四种抗锯齿:时间超分辨率 (Temporal Super Resolution, TSR,默认)、时间抗锯齿上采样 (TAAU)、快速近似抗锯齿 (FXAA) 和仅前向渲染可用的多重采样抗锯齿 (MSAA)。TSR 是与平台无关的时间性上采样器,用低内部分辨率渲染,借助历史帧累积细节输出接近原生的画面,把节省的 GPU 时间留给 Nanite 与 Lumen。游戏开发 · UE5后处理体积与效果Post Process Volumes & EffectsUE 的后处理效果(调色、色调映射、泛光、曝光、景深、运动模糊等)通过后处理体积 (Post Process Volume) 或相机设置来指定,即使关卡里没有体积,引擎也有默认的后处理设置。多个体积重叠时按优先级 (Priority) 覆盖,用混合半径 (Blend Radius) 和混合权重 (Blend Weight) 平滑过渡;Infinite Extent (Unbound) 让体积作用于整个场景。图形学色调映射Tone Mapping色调映射把场景参考的辐射亮度转换为显示参考的辐射亮度,目标不是恒等复现、也不是把所有信息"挤进"显示范围,而是在显示条件下尽量复现观看原场景时的感知印象。它通常是曝光缩放加一条 S 形曲线(全局映射),之后可做调色;最后由显示编码输出到 SDR 或 HDR 显示器。图形学随机光线追踪与路径追踪Stochastic Ray Tracing & Path Tracing光线追踪用投射光线同时解决可见性问题和光照问题。GEA 从最简单的"眼睛光线 + 着色方程"讲起,逐步加入阴影光线、透射光线、用蒙特卡洛估计渲染方程的随机光线追踪、递归间接光照,再到每次只走一条路径的路径追踪、双向路径追踪和 Metropolis 光传输,最后讨论降噪与光线投射效率(GEA4 卷 II 12.6.3–12.6.5)。游戏数学信号与线性时不变系统Signals & LTI Systems信号与系统理论是几乎所有数字音频技术的数学基础,也用于图像处理、电子、流体等领域。核心结论是:线性时不变 (LTI) 系统完全由它的冲激响应 h 描述,任意输入的输出等于输入与 h 的卷积;借助傅里叶变换,时域卷积等于频域乘法,滤波器就是在频域里按频率响应 H(\omega) 衰减部分频率(GEA4 卷 II 15.2)。图形学可微渲染与神经渲染Differentiable & Neural Rendering逆向渲染 (inverse rendering) 要从图像反推场景参数 \mathbf x(形状、材质、光照……),通常写成优化问题 \mathbf x^=\arg\min{\mathbf x}g(f(\mathbf x)),其中 f 是渲染器,g 是损失函数。参数维度可达数百万,只能用梯度下降,因此需要可微渲染 (differentiable rendering):不构造巨大的雅可比矩阵,直接计算"图像空间梯度 × 雅可比"这一向量-矩阵乘积。难点是可见性造成的不连续、反向模式的内存开销和导数积分的采样。机器学习与渲染的结合可分三类:用学习得到的数据结构替换传统数据结构、用神经网络改进传统渲图形学片元着色器与 GLSL 基础Fragment Shaders & GLSL Basics片元着色器(fragment shader)是在每个像素(片元)上并行执行的小程序:输入位置等信息,输出颜色。GLSL 是 OpenGL / OpenGL ES / WebGL 共用的着色语言;本书用全屏 billboard 上的像素着色练习,建立程序化图形的基础心智模型。图形学着色器纹理采样Shader Texture SamplingGPU 把图像存成 sampler2D:一张浮点向量的「表」,坐标连续时硬件做插值。片元里用 texture2D(sampler, uv)(现代 GLSL 为 texture)按归一化 UV 取色。BoS 强调:通道是 [0,1] 连续域、可越界重复、可用噪声扭曲 UV——图像变成可拉伸的「数码软垫」,为后处理与光学玩具式特效铺路。游戏开发 · UE5Custom 材质表达式Custom Material ExpressionCustom 节点允许在材质图里直接写 HLSL:任意数量输入、指定输出类型,可选额外输出、define 与外部 .ush/.usf 包含路径。它是「内置节点做不到」时的逃生口;代价是无法常量折叠、输入仅函数局部可见、且必须是合法 HLSL。优先用内置节点与材质函数,只在必要时上 Custom。

被这些页面引用1 篇

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原