news 2026/4/30 10:42:06

【URP】Unity[后处理]色调分离SplitToning

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【URP】Unity[后处理]色调分离SplitToning

核心功能与用途

‌视觉风格化‌:将阴影和高光区域分离着色,常见于电影调色(如《银翼杀手2049》的橙青色调)或游戏场景氛围营造

‌色彩对比增强‌:通过互补色强化画面层次感,例如阴影用冷色(蓝)、高光用暖色(橙)

‌性能优势‌:属于低开销的色彩校正类后处理,适合移动端使用

发展历史

起源自传统胶片摄影的化学调色工艺,后引入数字图像处理

Unity早期通过Amplify Color等插件实现,2018年后整合到Post Processing Stack v2中,现为URP/HDRP标准组件

原理

SplitToning是Unity URP后处理中用于实现色调分离效果的技术,其核心原理是通过对图像的高光和阴影区域分别应用不同的颜色映射,从而创造出艺术化的色彩分级效果。以下是详细解析:

底层原理

‌颜色分离机制‌

SplitToning将图像像素按亮度分为高光(亮部)和阴影(暗部)两部分,通过阈值控制分离范围。高光区域应用_SplitToningHighlightsColor,阴影区域应用_SplitToningShadowsColor,中间过渡区域通过平滑插值混合。

‌LUT(颜色查找表)支持‌

URP可能结合LUT技术加速颜色映射。LUT将输入颜色值映射到预定义输出值,SplitToning的色调映射可通过LUT贴图(如1024x32尺寸)高效实现,每个Tile对应不同的亮度区间。

‌Shader实现流程‌

采样原始图像像素并计算亮度(如使用Luminance()函数)

根据亮度值选择高光或阴影颜色

应用平滑过渡(如smoothstep函数)避免硬边界

最终输出混合结果。

示例说明

以下是一个简化的Shader代码片段,展示SplitToning的核心逻辑:

hlsl

float3 ApplySplitToning(float3 inputColor, float3 shadowsColor, float3 highlightsColor, float balance) {

float luminance = Luminance(inputColor);

float t = smoothstep(0.2, 0.8, luminance); // 过渡区间控制

float3 shadows = lerp(inputColor, shadowsColor * inputColor, 1.0 - t);

float3 highlights = lerp(inputColor, highlightsColor * inputColor, t);

return lerp(shadows, highlights, balance); // 平衡参数调节整体倾向

}

‌参数说明‌:

shadowsColor/highlightsColor:阴影/高光的目标色调(如蓝色高光+橙色阴影)

balance:控制整体偏向高光或阴影(0.5为均衡)。

性能优化建议

‌与URP管线集成‌

通过RenderFeature将SplitToning作为后处理阶段插入渲染管线,注意在Volume组件中配置参数以实现动态调整。

‌结合SRP Batcher‌

若自定义Shader,需确保符合SRP Batcher要求(如使用CBUFFER封装变量),以减少DrawCall开销。

‌LUT优化‌

使用256x16的小尺寸LUT贴图可降低带宽占用,但可能损失精度;1024x32适合高质量需求。

典型应用场景包括电影感调色(如《银翼杀手》风格的冷色调高光+暖色调阴影)或风格化游戏渲染

参数详解与用例

参数 含义 典型用例

Shadows 阴影区域色调(RGB) 暗部填充冷色(如#1E3A8A)增强景深

Highlights 高光区域色调(RGB) 亮部使用暖色(如#F59E0B)模拟阳光

Balance 阴影/高光混合权重 正值偏向高光,负值强化阴影(-20~20)

URP实现流程

SplitToningExample.cs

using UnityEngine;

using UnityEngine.Rendering;

using UnityEngine.Rendering.Universal;

public class SplitToningExample : VolumeComponent, IPostProcessComponent {

[Tooltip("阴影色调")] public ColorParameter shadows = new ColorParameter(Color.blue);

[Tooltip("高光色调")] public ColorParameter highlights = new ColorParameter(Color.yellow);

[Tooltip("平衡值")] public ClampedFloatParameter balance = new ClampedFloatParameter(0f, -20f, 20f);

public bool IsActive() => shadows.value != Color.gray || highlights.value != Color.gray;

public bool IsTileCompatible() => false;

}

SplitToningRenderPass.cs

using UnityEngine;

using UnityEngine.Rendering;

using UnityEngine.Rendering.Universal;

public class SplitToningRenderPass : ScriptableRenderPass {

private Material material;

private SplitToningExample settings;

public SplitToningRenderPass(Material mat) {

material = mat;

renderPassEvent = RenderPassEvent.BeforeRenderingPostProcessing;

}

public void Setup(SplitToningExample volSettings) {

settings = volSettings;

if (settings != null)

material.SetColor("_Shadows", settings.shadows.value);

material.SetColor("_Highlights", settings.highlights.value);

material.SetFloat("_Balance", settings.balance.value);

}

public override void Execute(ScriptableRenderContext context, ref RenderingData data) {

CommandBuffer cmd = CommandBufferPool.Get("SplitToning");

Blit(cmd, ref data, material, 0);

context.ExecuteCommandBuffer(cmd);

CommandBufferPool.Release(cmd);

}

}

SplitToningFeature.cs

using UnityEngine;

using UnityEngine.Rendering.Universal;

public class SplitToningFeature : ScriptableRendererFeature {

private SplitToningRenderPass pass;

public Material effectMaterial;

public override void Create() {

pass = new SplitToningRenderPass(effectMaterial);

}

public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData data) {

var stack = VolumeManager.instance.stack;

var settings = stack.GetComponent<SplitToningExample>();

if (settings.IsActive()) {

pass.Setup(settings);

renderer.EnqueuePass(pass);

}

}

}

使用步骤

‌创建Volume Profile‌

Hierarchy右键 → Volume → Global Volume

添加SplitToningExample组件

‌Shader实现‌

hlsl

// Shader核心算法

half3 ApplySplitToning(half3 color, half3 shadows, half3 highlights, half balance) {

half luminance = Luminance(color);

half t = saturate(luminance - balance * 0.01);

return lerp(shadows, highlights, t) * color;

}

‌效果调试‌

阴影色调:适用于地下城/夜晚场景(#2E1065)

高光色调:适合沙漠/黄昏(#F97316)

Balance:-10使画面更阴沉,+10增强阳光感

性能优化建议

避免与Bloom等高开销效果叠加使用

移动端建议使用LUT(颜色查找表)替代实时计算

通过Local Volume按需启用(如仅在过场动画使用)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/1 7:40:13

【面板数据】地市机械总动力化肥施用量数据(2001-2023年)

数据简介&#xff1a;机械总动力主要用于农、林、牧、渔业的各种动力机械的动力总和&#xff0c;包括耕作机械、排灌机械、收获机械、植保机械等&#xff0c;按能源类型可分为柴油、汽油、电力及其他动力。总动力以法定单位千瓦&#xff08;kW&#xff09;计量&#xff0c;统计…

作者头像 李华
网站建设 2026/5/1 7:41:03

PPT一键美化内容优化智能工具,核心功能,上传粗糙PPT,自动优化排版,匹配模板,精简文字,标注关键词,生成演讲脚本,兼容多格式导出,应用场景,提升职场人PPT制作效率与呈现效果

PPT一键美化智能工具设计方案下面是一个基于Python的PPT一键美化智能工具的设计方案&#xff0c;包含核心功能和实现思路。系统架构设计graph TDA[用户界面] --> B[文件上传模块]B --> C[PPT解析引擎]C --> D[内容优化模块]D --> E[模板匹配引擎]E --> F[排版优…

作者头像 李华
网站建设 2026/5/1 7:39:33

dora-rs低延迟数据流框架:实时AI处理的终极解决方案

dora-rs低延迟数据流框架&#xff1a;实时AI处理的终极解决方案 【免费下载链接】dora dora goal is to be a low latency, composable, and distributed data flow. 项目地址: https://gitcode.com/GitHub_Trending/do/dora 痛点分析&#xff1a;现代AI应用的技术瓶颈 …

作者头像 李华
网站建设 2026/4/30 10:43:36

PocketHub移动开发革命:随时随地掌控GitHub项目的高效方案

你是否曾经在通勤路上突然想起要查看一个重要的Pull Request&#xff0c;却因为电脑不在身边而束手无策&#xff1f;或者在外出时收到紧急issue通知&#xff0c;却无法及时响应&#xff1f;这些困扰开发者的移动协作难题&#xff0c;现在有了完美的解决方案。&#x1f680; 【免…

作者头像 李华
网站建设 2026/5/1 8:32:39

常用的贝叶斯代理模型

主要包含两个部分一个代理模型&#xff08;surrogate model&#xff09;&#xff0c;用于对目标函数进行建模。代理模型通常有确定的公式或者能计算梯度&#xff0c;又或者有已知的凹凸性、线性等特性&#xff0c;总之就是更容易用于优化。更泛化地讲&#xff0c;其实它就是一个…

作者头像 李华
网站建设 2026/4/18 11:16:21

71、技术综合指南:涵盖系统、网络、编程与多媒体

技术综合指南:涵盖系统、网络、编程与多媒体 1. 系统基础 Linux 与 Ubuntu :Linux 具有成本低、跨平台开发等优势,可用于桌面和服务器平台。Ubuntu 以 Debian 为基础,有商业支持和丰富的文档资源,包括网络搜索、网站、IRC 及邮件列表等。Ubuntu 有多种变体,如 Kubuntu…

作者头像 李华