type
status
date
slug
summary
tags
category
icon
password
fullWidth
fullWidth
🖤
《幻塔》项目组在UFSH2024上分享了动画流程渲染管线,其中提到了三种常见的卡渲后处理方法——柔光、背景透光、暗部晕染,这里对这些后处理方法进行简单探究和实践。 分享视频地址:【[UFSH2024]用虚幻引擎5为《幻塔》定制高品质动画流程风格化渲染管线 | 晨风 Neverwind 完美世界游戏】
源码Git传送门:

一些必要的前置知识

现代图形渲染管线

现代图形学管线在广义上可分为以下几个阶段:
  1. 几何处理阶段
      • 顶点着色器(Vertex Shader)
      • 曲面细分(Tessellation)
      • 几何着色器(Geometry Shader)
      • 裁剪与屏幕映射
  1. 光栅化与片段处理
      • 光栅化(Rasterization)
      • 片段着色器(Fragment/Pixel Shader)
  1. 后处理阶段
      • 颜色校正(Color Grading)
      • 模糊(Blur)或锐化(Sharpen)
      • 抗锯齿(FXAA/TAA)
      • 景深(Depth of Field)
      • 屏幕空间反射(SSR)或环境光遮蔽(SSAO)

Unity内置管线后处理架构

Unity内置管线的后处理实现依赖Shader+C#脚本协作
  1. OnRenderImage方法(C#脚本)
      • 挂载在摄像机上的脚本通过OnRenderImage(RenderTexture src, RenderTexture dest) 方法捕获当前渲染的屏幕图像src
      • 使用Graphics.Blit(src, dest, material)src传递给Shader进行处理,并输出目标到dest,通常是最终屏幕另一个RenderTexture
  1. 后处理Shader
      • 后处理不参与光照计算,因此必须是Unlit Shader
      • 使用片段着色器对像素进行处理,如模糊、调色等;顶点着色器通常直接使用Unity内置的vert_img(定义在Unity.cginc)而无需手动编写。
  1. 材质(Material)
      • 后处理Shader需要绑定到一个材质,并在C#脚本中引用该材质。
      • 通过material.SetFloatmaterial.SetTexture等函数动态调整Shader参数。
  1. RenderTexture管理
      • 复杂的后处理可能需要多个RenderTexture进行中间存储(如高斯模糊的降采样和升采样过程)。
      • 需要手动释放使用完毕的RenderTexture以避免内存泄漏

渲染后处理和绘画色彩理论

卡通渲染后处理与绘画色彩理论密切相关,借鉴了传统动画和插画中的光影处理手法
🖤
夹带私货说明:文章的例图均来源于我喜欢的一些动漫,和我特别喜欢的画师REDUM。
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT

柔光效果

柔光滤镜通过扩散入射光,使得图像的亮部变得模糊,让图像更柔和。
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
  • 绘画理论依据:参考了传统动画中的 "色调过渡" 技法。通过提升暗部亮度并降低对比度,模拟绘画中避免死黑、保持色彩通透性的原则(如迪士尼动画的 "色价理论",即通过明暗层次而非纯黑表现体积)。
    • REDUM作品中的柔光效果
      REDUM作品中的柔光效果
  • 动漫手法参考:京都动画公司的作品《吹响吧!上低音号》常用柔光处理环境光,避免阴影过于生硬。
    • 《吹响吧!上低音号》中的柔光效果
      《吹响吧!上低音号》中的柔光效果

背景透光效果

背景光远远超过角色本身的亮度时,使用这个效果可以营造角色被光包裹的氛围。
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
  • 绘画理论依据:源自 "空气透视""边缘光" 理论。通过让角色边缘与背景光色相融合,模拟光线散射效果。
    • REDUM作品中的背景透光效果
      REDUM作品中的背景透光效果
  • 动漫手法参考:新海诚的动画,如《天气之子》,大量使用背景透光,通过高饱和度的环境光晕染角色轮廓,增强画面沉浸感。
    • 《天气之子》中的背景透光效果
      《天气之子》中的背景透光效果

暗部晕染效果

让亮部的颜色过渡到暗部,解决暗部过于“沉闷”的问题。
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
UFSH2024《幻塔》项目组分享PPT
  • 绘画理论依据:借鉴了 "反光色""阴影透色" 理论。传统绘画中暗部常融入环境色或亮部颜色,避免暗部沉闷(安德鲁·卢米斯提出的色彩互动原则)。
    • REDUM作品中的暗部晕染效果
      REDUM作品中的暗部晕染效果
  • 动漫手法参考:MAPPA的动画作品《电锯人》中,人物面部的明暗交界处常用亮部颜色过渡,增强皮肤“通透”的感觉。
    • 《电锯人》中的暗部晕染效果
      《电锯人》中的暗部晕染效果

用Unity内置管线实操一下!

柔光效果

Pass 1: 提取高光部分

实现:根据亮度转换公式brightness = 0.2126*R + 0.7152*G + 0.0722*B将RGB颜色转换成亮度,根据亮度阈值提取画面中较亮的部分。
C#脚本:将高光部分保存到brightRT渲染纹理。
FrameDebugger中应用Pass 1前后对比
FrameDebugger中应用Pass 1前后对比
不同Brightness Threshold效果
不同Brightness Threshold效果

Pass 2: 高斯模糊处理

实现:采用标准3×3高斯模糊核对图像进行模糊。
C#脚本:将Pass 1中得到的brightRT进行多次降采样和高斯模糊。
多次降采样和高斯模糊的迭代过程
多次降采样和高斯模糊的迭代过程

Pass 3:最终合成

实现:将模糊后的高光RenderTexture通过变亮的混合模式叠加到原图。
C#脚本:
柔光后处理步骤图
柔光后处理步骤图

完整代码

Diffuse.shader
DiffuseEffect.cs

实现效果

Diffuse Off VS Diffuse On
Diffuse Off VS Diffuse On
BloomIntensity:75; BloomThreshold:0.25; BlurSize:0.005; BlurIterations:4
BloomIntensity:75; BloomThreshold:0.25; BlurSize:0.005; BlurIterations:4

背景透光效果

Pass 1: 从背景中抠去角色

实现:角色区域输出透明色,背景区域保留原图,生成一张“反向遮罩”。
C#脚本:调度shader从背景中抠除角色,保存结果到bgWithoutCharacterRT
从背景中抠去角色
从背景中抠去角色

Pass 2: 高斯模糊处理

实现:采用标准3x3高斯模糊核对图像进行模糊,模糊后的背景区域会渗透到原本透明区域。
C#脚本:将Pass 1中得到的bgWithoutCharacterRT进行多次降采样和高斯模糊,迭代模糊可增强渗透效果(blurIterations控制强度)。
迭代四次降采样和高斯模糊后的效果
迭代四次降采样和高斯模糊后的效果

Pass 3: 模糊遮罩与角色取交

实现:用角色Alpha遮罩裁剪模糊结果,仅保留角色轮廓周围的模糊背景(模拟透光区域)。
C#脚本:将Pass 2中得到的bgBlurredRTcharacterTexture取交集,保存结果到characterMaskRT
notion image

Pass 4: 最终合成

实现:将原始背景、角色和透光效果混合,透光部分使用加法混合,通过maskedBlur.a控制透光强度。
C#脚本:
背景透光后处理步骤图
背景透光后处理步骤图

完整代码

Backlit.shader
BacklitEffect.cs

实现效果

Backlit Off VS Backlit On
Backlit Off VS Backlit On
BlurSize:0.01; BlutIterations:4
BlurSize:0.01; BlutIterations:4

暗部晕染效果

Pass 1: 暗部分离

实现:DiffuseRT需由外部脚本生成,标记暗部区域(R通道=0.0),输出硬边缘纯白色区域。
C#代码:得到角色摄像机上的渲染组件Test中保存的DiffuseRT对象,设置给_DiffuseRT,调度shader分离亮部和暗部,暗部保存到darkAreaRT
根据角色相机渲染的diffuseRT得到纯白色硬阴影暗部区域
根据角色相机渲染的diffuseRT得到纯白色硬阴影暗部区域

Pass 2: 高斯模糊处理

实现:采用标准3×3高斯模糊核对图像进行模糊,使得硬边缘纯白色区域变成软边缘。
C#脚本:将Pass 1中得到的darkAreaRT进行多次降采样和高斯模糊,得到darkSoftAreaRT
多次降采样和高斯模糊的迭代过程
多次降采样和高斯模糊的迭代过程

Pass 3: 合成暗部

实现:将模糊后的白色遮罩转换为_BlurredColor,并取反Alpha,用于后续Multiply混合。
C#脚本:调度shader,将处理结果保存到finalDarkAreaRT
将模糊后的白色遮罩转成阴影色
将模糊后的白色遮罩转成阴影色

Pass 4: 最终合成

实现:在角色颜色基础上使用Multiply+Add模式混合暗部晕染的颜色,再与背景混合。
C#脚本:调度shader进行颜色混合。
暗部晕染后处理步骤图
暗部晕染后处理步骤图

完整代码

DarkBlur.shader
DarkBlurEffect.cs

实现效果

notion image
notion image

三种后处理效果合并

完整代码

CombinedEffect.cs中将所有效果合并,输出到finalRT
因此还需要一个用于合并效果的Blend.shader,用变亮(或其他)混合方式合并三种效果。

实现效果

后处理前 VS 后处理后
后处理前 VS 后处理后

附录:角色渲染将光照梯度输出到RT

用于渲染角色的shader使用了三个Pass:
  • Pass 0:预计算光照梯度
  • Pass 2:卡渲的Forward Pass
  • Pass 3:描边Pass
其中Pass 1的渲染结果需要保存在diffuseRT中供Pass 2和其他shader(主要是DarkBlur.shader)使用,在主线程中设置材质并调度shader
 
捣鼓记录:【Unity内置管线】角色NPR渲染的简单实践UnrealCircle摘要:TypeScript、PuerTS、V8优化实践 by 王宏波
Loading...
Latest posts
工作笔记:一些乱七八糟的踩坑记录
2025-5-15
游戏AI行为决策-分层任务网络(HTN)的简单应用
2025-5-7
自卷笔记:一些乱七八糟的踩坑记录和小知识小技巧
2025-5-7
捣鼓记录:【Unity内置管线】绘画色彩理论在卡渲后处理中的应用
2025-4-26
游戏算法-Floyd搜索算法知识梳理和通用框架
2025-4-24
捣鼓记录:【Unity内置管线】角色NPR渲染的简单实践
2025-4-23