【URP】Unity[后处理]晕影Vignette

【从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

    c 复制代码
    Shader "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开始探索游戏渲染】专栏-直达

(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)