资讯动态

UE4后期处理材质实战:打造夜视仪与扫描线效果

发布时间:2026/9/16 22:48:38 来源:尧图企业网站定制
1. 动手之前先弄清后期处理材质是在渲染链的哪一步插手画面夜视仪和扫描线这类效果我见过很多人一上来就打开材质编辑器拉几个节点把画面调绿、加几条横线就交差。这样做出来的东西静态截图看好像还行一旦动起来或者放进具体关卡里就会暴露各种不对劲——噪点像脏东西挂在屏幕上扫描线在抗锯齿下闪烁成一片暗部死黑亮部糊成白板。根子上的问题不是节点用得不对而是没搞明白你正在操作的这一层到底是什么。UE4里的后期处理材质Post Process Material工作在场景渲染的后期阶段。你从摄像机看到的整个画面经过几何体渲染、光照计算、透明物体混合之后会先输出到一张场景颜色纹理上这张纹理就是后期处理材质的输入。后期处理材质拿到它经过你的一堆节点重新计算再把结果交给色调映射和最终的显示输出。换句话讲它是“画面已经画完之后在显示器亮起来之前”的最后一层滤镜。这个执行顺序决定了三件很重要的事。第一你处理的是HDR还是LDR直接影响夜视仪的效果取向。UE4默认管线里后期处理材质拿到的是包含光照信息的HDR场景颜色亮部和暗部的动态范围还很宽。如果你在这时候做亮度压缩和增益夜视仪就能产生一种“低光环境下把微弱信号拉起来”的感觉如果你等色调映射之后再做亮部已经饱和死白再怎么调都救不回来。第二后期处理材质是逐像素执行的它没有场景内物体的概念不知道哪个像素属于角色、哪个属于墙壁只知道屏幕上每个位置的颜色、深度、法线等信息。我的意思是你只能做全局效果或者依靠深度、法线这类信息做区域区分但做不到像材质系统那样识别具体物体然后单独处理。夜视仪恰好是一个纯屏幕空间效果它不需要区分物体所以选后期处理材质非常合适。第三材质域设置为“后期处理”之后混合模式的选择会影响你叠加效果的方式。我的习惯是用“可混合”Translucent模式这样材质通过Opacity或者最终的透明度输出控制整体强度开关夜视仪时方便做平滑过渡。有些做法会用“加性”模式来做扫描线和高光干扰层因为它可以直接在原画面上添加亮度。但如果你要做的是完全替换画面色调的夜视仪可混合模式更常用、也更灵活。在材质编辑器里创建后处理材质时输出节点最终连接的是“自发光颜色”Emissive Color或“最终颜色”Final Color而原始画面通过SceneTexture节点选择PostProcessInput0取进来。你可以把这个输入理解成一张“已经画好的底图”。后续所有操作都是在这张底图的基础上做重新映射。把这一步的定位搞清楚后面所有参数调起来才有方向感。这也是我在做系列后期处理教程时一直强调的第一件事先知道你在渲染流程的哪一层干活再去想怎么调。2. 夜视仪的视觉构成从真实光学器件到材质节点表达夜视仪不是“把画面变绿”这么简单。真实设备的原理是微光图像增强环境里的微弱可见光经过物镜进入设备打在光电阴极上转换成电子信号电子经过微通道板被放大成千上万倍最后轰击荧光屏重新变成人眼看得见的光。这一套过程带来的视觉特征主要有四个对应到材质里就是四种处理亮度重映射、绿色色偏、叠加噪点、暗角与镜筒效应。2.1 亮度重映射微光增强的核心真实夜视仪的厉害之处在于它能把非常暗的环境提亮到可以看清的程度。放到材质处理里就是把输入颜色的亮度做一个非线性重映射。这里有个常用公式思路Luminance dot(SceneColor, float3(0.2126, 0.7152, 0.0722)) Enhanced clamp((Luminance - 0.1) * 2.5, 0.0, 1.0)减0.1可以理解为把传感器底噪基线去掉避免把一片死黑无脑抬成灰蒙蒙的雾。乘2.5是增益这个系数决定了亮部的压缩程度。如果整个场景本来就是白天乘2.5之后高光会大面积爆掉所以夜视仪效果通常配合游戏里的暗场景使用或者用另一个强度参数动态控制增益。材质节点的主链路是SceneTexture取输入图 → 转亮度用Desaturation或自己搭Dot→ 减法 → 乘法 → Clamp。这一串下来得到的就是一个经过增益的灰度图。2.2 绿色色偏不要做成“中毒脸”荧光屏用的是P43或P45荧光粉发光峰值大约在545纳米也就是黄绿色波段。人眼对这个波段的敏感度最高所以设备选这种颜色能让操作者在暗环境里看得更清楚。但屏幕前的观感并不是纯正的#00FF00反而是偏黄绿、偏青绿一点才像真的。我做色偏从来不用简单的Lerp(SceneColor, GreenColor, 0.5)那样画面会丢失层次像蒙了一层廉价滤镜。更靠谱的做法是分通道处理绿色通道保留或轻微增强红色通道打一个折扣比如乘以0.6到0.8蓝色通道再压低一点比如乘以0.4到0.6在材质里我会把增益后的灰度图分别乘上一个三通道系数比如float3(0.7, 1.1, 0.5)然后用Intensity参数控制这个色偏层和原色层之间的混合比例。这样得到的画面该亮的地方亮、该暗的地方暗绿色感是“长”在每个亮度层级里的而不是浮在表面的一层绿膜。2.3 噪点夜视仪的灵魂这是夜视仪效果里最容易被忽略、也最关键的环节。图像增强器的电子放大过程会带来本质性的信噪比问题环境光越暗放大倍数越高噪声越明显。所以画面里那种密密麻麻的颗粒感不是贴图瑕疵而是设备物理特性的直接体现。噪点层在材质里做起来不复杂但要做对位置。第一步用Noise节点或者Voronoi节点生成随机灰度。Noise节点适合做连续的Perlin噪声颗粒感太“顺滑”不太像电子噪声Voronoi节点的细胞状结构更有噪点质感。如果你手头有现成的电视雪花噪点贴图也可以直接采样但记住要用三线性采样并且开平铺不然屏幕边缘会出现拉伸。第二步给噪点加时间动画。Time节点乘以一个速度系数加进UV坐标里再采样。这样噪点每帧都在变化模拟出信号实时抖动的感觉。速度系数一般控制在0.1到0.5之间太快会让人闪得眼花太慢又觉得像静电贴图。第三步把噪点和亮度关联起来。暗部放大增益更高噪声自然更明显。做法是NoiseResult * (1 - EnhancedLuminance)也就是说亮度越低的地方噪点越重亮部噪点被信号掩盖。这个细节一加夜视仪的“真实感”立刻上一个档次。噪点强度参数也要单独暴露出来我一般给到0.03到0.08的基准值再配合暗部增益动态调整。太大就像沙尘暴太小又丧失了那个味道。2.4 暗角、镜筒效应和边缘光晕真实夜视仪的目镜里看出去边缘会有明显的暗角这是物镜和目镜系统的光学特性。材质里用UV到屏幕中心的距离做衰减就能模拟Dist distance(UV, float2(0.5, 0.5)) Vignette smoothstep(0.75, 0.35, Dist)调试的时候可以加一个Power节点控制暗角的衰减曲线Power值越大暗角收缩得越紧。我的经验是0.4到0.6之间观感最舒服太大会让人感觉一直戴着一个桶看世界。另外可以加一圈镜头内壁的反光也就是在屏幕边缘内侧出现一点泛光。这个做不做看项目风格我做军事写实类项目时会加一层非常淡的绿色边缘光晕模拟物镜内部反射。做法是先算一个比暗角范围更大一些的环状遮罩再乘上一个淡绿色。到这一步一个正经的夜视仪底色就出来了亮度经过增益的灰度图叠加绿色色偏加上动态噪点边缘被暗角包围。这是“底料”扫描线现在就可以往里加了。3. 逐节点搭建一个可复用的夜视仪后期材质上一章讲的是构成思路这一章把完整的材质链路按顺序走一遍。我会直接给出可操作的节点连接关系和参数范围你在编辑器里跟着拖就行。3.1 创建材质并完成基础调色链路在内容浏览器里右键创建材质命名M_NightVision。双击打开材质编辑器把材质域Material Domain设为“后期处理”Post Process。混合模式设为“可混合”Translucent。着色模型保持“无光照”Unlit即可。新建一个SceneTexture节点Texture Id选择PostProcessInput0。这里的PostProcessInput0就是摄像机渲染完成的原始画面。我先把它接入亮度转换节点。UE4里没有单独的Luminance节点但有一个更简单的做法用Desaturation节点把饱和度降到0得到的就是灰度图。注意Desaturation节点会自动带一个权重系数默认0.5灰度我们只需要0灰度所以把权重设为0。这一步得到的灰度图就等价于亮度信息。然后搭这样一串节点链SceneColor(PostProcessInput0) → Desaturation (权重0) → Subtract(0.1) → Multiply(2.5) → Clamp(0, 1)这时你会得到一张整体提亮、暗部被压下去一点的高对比灰度图。用这个灰度图作为后续所有操作的主信号。3.2 加入色调、高光和信号基础层新建一个VectorParameter命名TintColor默认值设为(0.7, 1.15, 0.55)这就是夜视仪的色偏基准。用Multiply把灰度图乘上TintColor得到色偏后的基础图。光有色还不够夜视仪画面里高光区域会有一种“溢出感”好像信号过载一样。这点可以用一个较弱的Blur效果或者直接用PostProcessInput0里原本的高光残影叠加。为了避免材质过于复杂我常用一个偷懒但效果不错的方案把色偏基础图做一个Power(0.8)的Gamma调整让亮部变柔再用LinearInterpolateLerp按强度参数混合回去。继续新建几个标量参数全部默认0到1NVIntensity整体效果强度初始0开夜视仪时向1过渡。NoiseIntensity噪点强度建议0.05。ScanlineIntensity扫描线强度建议0.1。VignetteIntensity暗角强度建议0.5。3.3 噪点层的完整接法新建Voronoi节点Position输入为UV TextureCoordinate × 屏幕密度系数(比如600) Time × 噪声速度Voronoi节点默认输出的是细胞的边缘距离信息正好有那种密密麻麻的点状结构。但它默认范围比较平所以后面接一个Power(2.0)增强对比度再接OneMinus反转一下让它变成“暗底亮斑”而不是“亮底黑斑”。我要跟音频做类比这里其实特别像降噪你需要的是信号里的“底噪”而不是把整个画面蒙上砂纸。所以噪声层最后要乘上(1 - EnhancedLuminance)也就是前面说的暗部噪点更明显亮部噪点被掩盖。连接最终为VoronoiOutput → Power(2.0) → OneMinus → Multiply(1 - EnhancedLuminance) → Multiply(NoiseIntensity) → Add(主画面)3.4 扫描线层的接入新建一个材质函数或者直接搭节点核心是利用屏幕UV的Y分量做周期性条纹UV.y × ScanlineCount → Frac → Step(0.93) → 得到黑白相间的细线把得到的结果乘上一个很小的负系数比如-0.08加到主画面上相当于让扫描线位置的像素变暗一点点。注意这个系数要小扫描线的作用是“让眼睛感觉到屏幕有行扫结构”而不是真的画一堆黑道道挡住画面。我建议使用SmoothStep(0.90, 0.95, Frac(...))来代替硬切Step这样扫描线的边缘会带一点柔和的过渡在动态画面里不会闪得太厉害。3.5 暗角层与输出最后把最终颜色接上暗角Distance(UV, 0.5) → SmoothStep(0.75, 0.35, Dist) → Power(0.5~0.7) // 调整暗角曲线 → Lerp(1.0, 0.0, VignetteIntensity) → Multiply(最终颜色)然后把这个结果输出到材质节点的最终颜色输出在自发光颜色引脚上。注意后期处理材质里如果你用的是可混合模式可能还需要输出一个Opacity值我一般直接把NVIntensity接过去这样整个后处理材质自身的混合权重也会跟着开关过渡。3.6 放入场景并验证在场景里放一个Post Process Volume勾选“无限范围”Unbound把M_NightVision拖进后期处理材质数组Blend Weight设为1。回到主视口你会立刻看到全屏效果。到这一步你必须做一次验证在材质里把NVIntensity临时调到0画面应该完全恢复原样。如果调成0后画面上还有残留的绿色或噪点说明你链路里的某个参数没有受总强度控制这是后处理材质最常犯的错误。我习惯把所有效果层最后都汇总到总强度参数上做一次总闸而不是单独控制每一层。这样后续接入玩法逻辑时开关夜视仪只需要推一个参数。4. 扫描线的不同形态从CRT扫描条纹到动态信号干扰扫描线这个效果单独拿出来说其实可以做很多种变体。标题里把夜视仪和扫描线并列说明项目里多半会把它俩结合用夜视仪提供整体色调扫描线提供屏幕质感。这里我拆开讲几种常用形态以及它们背后的数学逻辑。4.1 静态CRT扫描线的数学原理CRT扫描线本质上是显示设备逐行扫描时行与行之间的回扫期不发光或发光弱形成的暗色横纹。在后期处理材质里模拟它只需要在屏幕Y方向构造一个高频周期信号。屏幕UV的Y分量本身是从0到1的线性渐变乘以一个较大整数比如400或600再用Frac取小数部分就得到了一个重复的“锯齿波”。对锯齿波做阈值判断Frac(UV.y * LineCount) 0.93结果为1的像素就是扫描线所在位置。这是数学本质非常容易理解。但这里有个细节屏幕上的实际扫描线数量应该跟屏幕分辨率相关否则同一套材质在1080P和4K屏上效果差异很大。在UE4里可以用ScreenPosition的Y通道拿到屏幕像素坐标除以固定像素间隔比如3像素一条线再对结果做周期处理这样不管什么分辨率扫描线都是物理上每3像素出现一条。我通常这么连ScreenPosition.y / 3.0 → Floor → Frac → SmoothStep(0.95, 1.0, ...)如果你没有特殊的分辨率适配需求直接用纹理坐标乘以600这条更省心的路也行。我们的目标是给玩家“感觉到扫描线”而不是做一份工艺图纸。4.2 动态扫描带屏幕上缓缓扫过的那道光除了一整屏均匀分布的扫描条纹很多时候还要做一个动态扫描带——一条从屏幕顶部缓缓扫到底部的亮带或暗带仿佛设备正在逐行刷新图像。这在射击游戏的夜视仪或者监控屏幕上很常见。动态扫描带的节点逻辑比静态线还简单BandPos Frac(Time * Speed) // 当前扫描带位置0到1循环 Band SmoothStep(BandPos, BandPos 0.05, UV.y) - SmoothStep(BandPos 0.05, BandPos 0.15, UV.y)用两个SmoothStep相减得到一段0到1之间的脉冲只在扫描带位置附近是有值的。把它乘上一个亮色或者暗色叠加到主画面上就成了一条缓缓移动的扫描带。这里有个实际经验扫描带不要做得太亮、太宽否则会像屏幕裂了一道白光。我一般控制在原亮度基础上0.1左右宽度在屏幕高度的5%到10%之间。运动速度建议控制在2到5秒完成一次循环这个区间看起来最像“设备工作”不会让人焦虑。4.3 信号干扰与错位效果夜视仪设备在受到外部冲击或信号干扰时画面会出现局部错位、色彩偏移、滚动条纹等故障风格效果。这些归到“扫描线”大类里一起做掉会比较完整。错位效果的本质是把原本的UV坐标做一个局部偏移在一个干扰带内UV.x被加上一个偏离值导致画面横向撕裂。节点逻辑Interference Frac(Time * InterferenceSpeed) InterferenceMask SmoothStep(...条件判断...) OffsetUV.x UV.x InterferenceMask * 0.05 FinalColor SceneTexture.Sample(OffsetUV)用SceneTexture按偏移后的UV重新采样场景颜色再和原图按遮罩做Lerp。这个效果在夜视仪里非常带感尤其是被打的时候画面“撕”一下比单纯加红色全屏闪烁有质感得多。色差偏移也是干扰层的好选择把UV分别偏移一个微小量之后分别采样R通道和B通道合成出来的边缘会有彩虹状色散模拟镜头色差。在UE4里也可以用固定的SceneTexture加UV偏移做到成本不高但注意不要整个屏幕都加利用Mask遮住边缘和干扰带区域就好。5. 让它能被玩家握在手里参数驱动、按键映射与平滑开关特效做得再好如果玩法层不知道怎么开关美术设个参数一堆你也不知道怎么传项目迟早卡在对接上。我做后期处理类效果时的习惯是所有需要玩法控制的量都收敛成少数几个标量参数Blueprint侧只操作这些参数不碰材质内部的节点逻辑。夜视仪材质里需要暴露的参数我建议控制在这五个参数名类型作用NVIntensity标量总开关0关1开驱动全效果过渡NoiseIntensity标量噪点强度可做动态干扰ScanlineIntensity标量扫描线强度VignetteIntensity标量暗角强度TintColor向量色调基准换滤镜颜色用5.1 从Post Process Volume读取和设置参数在蓝图里操作后期材质参数常规做法是拿到场景里的Post Process Volume调用Set Scalar Parameter Value。但要注意这个函数操作的是Volume本体的Post Process Settings里的参数。如果你的材质是通过Blendable数组挂到Volume里的直接在蓝图上改参数时需要先通过AddOrUpdateBlendable把材质实例加进去。更干净的方式是直接在材质的Blendable条目上右键选择“创建材质实例”然后操作这个材质实例的标量参数。材质实例的好处是参数独立、可以预置不同档位比如一个“正常夜视”实例、一个“受干扰夜视”实例、一个“关闭”实例。玩法切换时直接替换或者改参数不用动原始材质。5.2 按键映射与外接设备映射的思路UE4默认的输入系统里映射按键非常简单在项目设置的输入Input里添加Action Mapping或者Axis Mapping然后蓝图里绑定事件或者用Enhanced Input。这个机制天然支持各种外接设备不只是键盘鼠标还有手柄、摇杆、方向盘这类模拟轴设备。夜视仪开关适合用Action Mapping触发方式可以是按键按下或者手柄的某个功能键。而在《撤离》类射击项目里我见过玩家希望用手柄右摇杆的上推动作去控制夜视仪增益强度——这种需求就适合Axis Mapping。轴值从0到1经过曲线映射后直接传给NVIntensity或一个单独的Gain参数。手感完全不一样玩家能通过压下摇杆的力度拿到“逐渐看清”的反馈而不是一个生硬的0/1开关。如果你需要更高精度的外设映射比如飞行摇杆上的旋钮、方向盘拨片UE4的新版增强输入系统都能把Raw Axis绑进来最后传递到的也是同一组标量参数。这就是参数收敛设计的好处材质侧只看到几个数字不知道背后连的是什么设备。5.3 平滑过渡与过渡音效不要直接Set Scalar Parameter把NVIntensity从0跳到1。画面从正常到夜视之间如果没有过渡眼睛会非常难受玩家会明显感到“闪了一下”。我习惯用Timeline或者节点插值在0.25秒到0.5秒内把参数从当前值过渡到目标值。材质里的总强度不是只控制最终混合的我建议把NVIntensity同时接到噪点、扫描线、暗角的强度上甚至参与色偏的混合权重。这样开关过程不只是画面从彩色变绿色而是所有夜视仪特征层一起“浮现”出来就像真的打开了设备电源荧光屏逐渐点亮。过渡发紫发白的一瞬间是夜视仪最有味道的时刻过度参数如果只混了一个颜色层就浪费了这个细节。顺便提一句过渡时如果有音频可以在蓝图的Timeline通知事件里触发“夜视仪启动”音效。画面上逐渐亮起的噪点和听觉上刺耳的电流声一配合沉浸感立刻拉满。6. 调试与性能实践全屏效果最容易翻车的几个地方后期处理材质是全屏逐像素执行的这个执行成本不能忽视。很多人第一次做夜视仪把噪点、扫描线、暗角、色差全堆在一个材质里结果帧率从100掉到40还说不清是哪个环节干的。这里我把我实际排查过的几个问题按类型列出来。6.1 噪点在TAA下为什么闪烁得厉害后处理噪点层使用临时抗锯齿TAA时经常出问题。TAA的原理是每帧对画面做微量抖动然后通过运动向量把相邻几帧的结果混合起来相当于在时间维度上“采样平均”。而噪点层本身就是随机高频信号正好对抗锯齿的假设造成致命干扰。最终画面会出现噪点被拉到视线方向、形成半透明的“脏拖影”。我踩过这个坑之后的处理方案是噪点的动画强度不要每帧完全随机而是保持“相邻帧之间的噪点位置有连贯性”。最简单的做法是让噪点纹理的UV随时间以一个很小的速度线性滚动而不是每帧跳一个随机值。这样噪点在时间轴上还是运动的但相邻帧有连续性TAA就能正确处理它。如果你用的是材质里的Noise节点加上绝对随机的坐标那恭喜你几乎必然中招。我最终会单独导一张平铺噪点贴图通过UV偏移来做动画这是目前我在夜视仪项目里效果最稳定的方案。6.2 扫描线在4K屏上的摩尔纹问题如果扫描线直接按固定像素数量生成在一部分分辨率下会产生摩尔纹扫描线和屏幕像素栅格发生干涉出现大范围的波纹闪烁非常丑。我当时的解决方式是让扫描线在后期处理里不做纯硬阈值而是用SmoothStep保留边缘过渡同时让线间距跟屏幕像素保持整数倍关系最大程度减少干涉。还有一点扫描线不要做成纯黑色要带一点暗绿色或者半透明的灰。纯黑扫描线在LCD屏幕上看起来就像屏幕上有脏污做旧CRT显示的质感时很容易翻车。6.3 后期处理材质的性能开销分布在哪里一个后期处理材质里性能的大头有三个像素数量全屏执行分辨率越高成本越高这是基础成本逃不掉。纹理采样数量每个TextureSample节点都是一次纹理读取噪声纹理、场景纹理、噪声贴图叠加起来采样次数多了带宽压力骤增。高开销节点比如Voronoi、大范围Blur、多次SceneTexture采样这些在低端GPU上格外费。我的优化经验是分优先级噪点层如果用了噪声纹理把纹理尺寸限制在256×256以内并且使用平铺模式扫描线层用纯数学运算不采样纹理模糊类效果能不用则不用非用不可时降低采样次数或者用双线性降分辨率再做升采样。现在回到“用查询还是物理模拟器来驱动效果”这个问题。夜视仪里的噪点、扫描线、屏幕干扰全部都是渲染层的数据处理用材质里的SceneTexture查询、UV计算、参数驱动就够了完全没有必要让物理模拟器介入。物理模拟器的强项是模拟刚体碰撞、关节约束、流体这类有真实物理规律的东西。如果把夜视仪的噪点抖动交给物理模拟器不仅性能开销成倍增加而且你得不到任何视觉上的好处纯属杀鸡用牛刀。反过来夜视仪开关时的相机镜头晃动、被打硬直时的画面抖动这些涉及摄像机运动的效果才适合交给物理模拟或动画曲线去驱动。分清这个边界项目的资源分配就不会乱。6.4 多Post Process Volume嵌套时的优先级问题一个项目里通常不止一个后期处理效果队友透视的边缘染色、受伤时的屏幕泛红、进入水域的色调变化都会以Post Process Volume的形式存在。当同一个像素同时命中多个Volume时UE4按Volume的Priority值从低到高叠加如果不小心把夜视仪Volume的优先级设成了默认它可能会被其他后期材质盖掉或者反过来盖掉别人的效果。我在项目里统一用一个管理蓝图维护全局后期处理栈每个效果绑定一个独立的VolumeVolume的Priority统一在管理器里赋值切换状态时只改Blendable的Blend Weight不改Priority。这比散落在关卡里的手动物理Volume好维护得多。排查这类问题时我会先开UE4控制台的vis命令查看当前生效的后处理设置例如r.VisualizeBuffer或专门的后期可视化调试模式确认夜视仪材质实际执行了没有。如果执行了但画面不对再用CompileShader和材质调试模式逐节点看中间结果。材质节点上每个引脚都可以点击后按Shift键实时预览这个功能是我做后期材质调试用得最多的比盲改参数高效太多。做完整套夜视仪和扫描线效果之后我自己最大的体会有两点一是效果堆叠时一定要有总强度参数做“总闸”否则玩法侧接起来会非常痛苦二是任何全屏效果都必须考虑它和画面已有的抗锯齿、动态模糊、泛光之间怎么相处而不是孤立地看材质本身。夜视仪和扫描线做得出彩的画面靠的从来不是某一个节点的奇技淫巧而是每一层都在恰好的位置、恰好的强度上各司其职。希望这篇从原理到实操的整理能帮你在自己的项目里少走几趟弯路。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价