【从UnityURP开始探索游戏渲染】专栏-直达
晕影(Vignette)是Unity URP后处理中的一种视觉效果,主要用于模拟摄影中图像边缘变暗或去饱和的现象。它通过将观众注意力引导至画面中心来增强视觉焦点,常见于电影、游戏等场景中。
发展历史
晕影效果最初源自摄影技术,后逐渐被引入数字图像处理领域。在Unity中,早期版本通过标准资源包实现,随着URP/HDRP管线的推出,该效果被整合到Volume框架中,成为模块化后处理系统的一部分。
实现原理
晕影通过计算像素与屏幕中心的距离,应用衰减函数产生边缘暗化效果。URP提供两种实现模式:
- 程序化模式:通过数学函数生成圆形/椭圆形晕影
- 蒙版模式:使用纹理贴图定义自定义形状
晕影(Vignette)在Unity URP中的底层实现基于屏幕空间距离计算和颜色混合算法.
数学计算模型
- 距离衰减函数 :通过计算像素坐标与屏幕中心(0.5,0.5)的欧氏距离,使用
length(abs(uv - center))生成径向梯度 - 平滑度控制 :对原始距离值应用
pow(saturate(dist), smoothness)运算,通过指数函数调整边缘过渡曲线 - 反向映射 :最终通过
1 - dist * dist将黑白关系反转,使中心区域保持明亮而边缘变暗
着色器实现
以下为简化后的HLSL代码片段:
c
hlsl
float2 uv = i.uv - _Center;
float dist = length(uv * _Intensity);
float vignette = pow(saturate(1 - dist * dist), _Smoothness);
return inputColor * vignette;
该算法在URP的PostProcessPass.cs中通过全屏绘制命令执行,每个像素都会经过此计算流程
模式差异
-
程序化模式:实时计算圆形/椭圆形遮罩,性能开销约0.3ms(1080p分辨率)
-
蒙版模式:采样外部纹理作为遮罩,支持任意形状但增加内存带宽消耗
-
Vignette.shader
cShader "Hidden/URP/Vignette" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _VignetteColor ("Vignette Color", Color) = (0,0,0,1) _VignetteCenter ("Center", Vector) = (0.5, 0.5, 0, 0) _VignetteIntensity ("Intensity", Float) = 1.0 _VignetteSmoothness ("Smoothness", Range(0,1)) = 0.5 } SubShader { Pass { HLSLPROGRAM #include "Packages/com.unity.render-pipelines.universal/ShaderLibrary/Core.hlsl" TEXTURE2D(_MainTex); float4 _VignetteColor; float2 _VignetteCenter; float _VignetteIntensity; float _VignetteSmoothness; float4 Frag(Varyings input) : SV_Target { float4 color = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv); float2 uv = input.uv - _VignetteCenter; float dist = length(uv * _VignetteIntensity); float vignette = pow(saturate(1 - dist * dist), _VignetteSmoothness); return lerp(_VignetteColor, color, vignette); } ENDHLSL } } }
该实现包含颜色混合、中心点偏移和动态平滑度控制,通过lerp函数实现颜色插值
完整实现流程
创建全局Volume
在Hierarchy右键 Create > Volume > Global Volume
添加Vignette效果
选中Volume对象 > Inspector > Add Override > Post-processing > Vignette
配置相机
选中主相机 > Rendering > 启用Post Processing
参数说明与用例
| 参数 | 类型 | 说明 | 典型用例 |
|---|---|---|---|
| Mode | 枚举 | 选择程序化/蒙版模式 | 程序化适合常规聚焦,蒙版用于艺术化效果 |
| Color | 颜色 | 晕影颜色(默认黑色) | 使用深蓝色模拟夜景 |
| Center | Vector2 | 效果中心点(0.5,0.5为屏幕中心) | 偏移中心模拟倾斜镜头效果 |
| Intensity | 0-1 | 暗化强度 | 0.3-0.5轻度引导视线,0.8+强烈戏剧效果 |
| Smoothness | 0-1 | 边缘过渡平滑度 | 0.2-0.5自然过渡,0.8+硬边缘 |
| Roundness | 0-1 | 形状圆度 | 1.0完美圆形,0.5适应屏幕比例 |
| Mask | 纹理 | 自定义蒙版纹理 | 使用星形蒙版创造特殊边框 |
艺术化应用案例
- 恐怖游戏:高强度(0.7)黑色晕影配合低平滑度(0.1),营造隧道视野效果
- 复古风格:棕色晕影+胶片颗粒,模拟老电影质感
- UI聚焦:短暂增强晕影引导玩家注意关键UI元素
【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)