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

news/2025/11/12 9:50:24/文章来源:https://www.cnblogs.com/SmalBox/p/19212564

【从UnityURP开始探索游戏渲染】专栏-直达

Split Toning(色调分离)是Unity URP后处理中用于对图像阴影和高光区域分别进行颜色校正的效果,通过独立控制阴影和高光的色调来创造独特的视觉风格。以下是详细解析:

核心功能与用途

  • 视觉风格化‌:将阴影和高光区域分离着色,常见于电影调色(如《银翼杀手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按需启用(如仅在过场动画使用)

【从UnityURP开始探索游戏渲染】专栏-直达
(欢迎点赞留言探讨,更多人加入进来能更加完善这个探索的过程,🙏)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/963041.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详细介绍:5-4〔OSCP ◈ 研记〕❘ SQL注入攻击▸基于 UNION 的SQLi

详细介绍:5-4〔OSCP ◈ 研记〕❘ SQL注入攻击▸基于 UNION 的SQLi2025-11-12 09:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !i…

npm yarn pnpm 区别

pnpm、npm、yarn三者是前端常用的包管理器,那么他们有什么区别呢? npm(Node Package Manager) npm是Node.js的默认包管理器。自Node.js发布以来,npm就一直作为它的一个组成部分存在,因此,安装Node.js时也会自动安…

第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025)

第七届智能控制、测量与信号处理国际学术会议 (ICMSP 2025) 2025 7th International Conference on Intelligent Control, Measurement and Signal Processing (ICMSP 2025) 第七届智能控制、测量与信号处理国际学术会…

文档内容比对桌面软件V2.2.0(新增详细报告输出)

一.简介 功能: 1.支持文本、word、excel、PDF(含扫描件)、图片等格式的内容比对 2.支持比对后的相似度等的统计 二.界面 修改: 1.界面重构,分为两栏 2.增加差异和相似度统计 主界面: 导出的html比对报告,增加相…

C#语言中使用using关键字的介绍

在 C# 语言中,“using”关键字被用于不同的上下文和目的,它的用法大体上可以被分为三类:导入命名空间、简化资源管理和提供别名。 首先,"using"关键字最常见的用途是导入命名空间。这在 C# 程序中非常普…

matplotlib 中文显示异常的修复方法

这个问题很常见 问题原因 1. 字体缓存污染 matplotlib 在第一次运行时创建字体缓存,如果之前有错误的字体配置或损坏的缓存,会导致后续所有绘图都使用错误的字体设置。 2. 缓存不更新 即使你后来添加了正确的中文字体…

P2490 [SDOI2011] 黑白棋 笔记

前置知识:K-Nim 游戏。 由于白棋和黑棋交错放并且只能向中间走,相邻的两个白黑棋中间的格子数即可看作一堆石子。 问题转换为:有 \(N=n-k\) 个完全相同的物品,\(M=\frac k 2\) 个不同的盒子,把若干个物品放进盒子…

深入解析:OpenAI推出即时支付功能,ChatGPT将整合电商能力|技术解析与行业影响

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

2025年卧式数控车床优质厂家推荐排行榜单

2025年卧式数控车床优质厂家推荐排行榜单前言随着制造业的快速发展,卧式数控车床作为精密加工的核心设备,其性能和质量直接影响着生产效率和产品质量。为帮助广大用户选择合适的设备供应商,我们特别整理了2025年度卧…

【machine learning】COVID-19 daily cases prediction - 指南

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

【开题答辩全过程】以 北京房屋租赁数据分析与可视化为例,包含答辩的问题和答案 - 教程

【开题答辩全过程】以 北京房屋租赁数据分析与可视化为例,包含答辩的问题和答案 - 教程2025-11-12 09:32 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important;…

phpMyAdmin Docker 容器化部署指南

phpMyAdmin是一款用PHP编写的免费开源工具,旨在通过Web界面管理MySQL和MariaDB数据库。它支持数据库管理、表操作、用户权限配置等多种功能,同时提供SQL语句直接执行能力,是Web开发者和数据库管理员的常用工具。概述…

2025年11月5日一星期

1..NET Framework 项目和.net core项目区分:.net frame是windows单独,.net core是跨平台2.查看服务器磁盘空间df -h,这里h指自动换算单位 [root@MiWiFi-RA70-srv backup]# df -h文件系统 大小 已…

高精度乘法模板(p1303)

P1303 A*B Problem 题目背景 高精度乘法模板题。 题目描述 给出两个非负整数,求它们的乘积。 输入格式 输入共两行,每行一个非负整数。 输出格式 输出一个非负整数表示乘积。 输入输出样例 #1 输入 #1 1 2输出 #1 2…

2025年云桌面软件排名

2025年云桌面软件排名:拓实科技领跑企业数字化转型随着企业数字化转型的深入推进,云桌面软件已成为现代企业IT基础设施的重要组成部分。作为深耕企业信息化建设23年的专业服务商,拓实科技凭借其卓越的技术实力和丰富…

2025年11月EGUOO京东自营:800万瓶纳豆激酶销量见证用户信赖

开场白 “我想给家里长辈买关节片,又怕海淘等太久,有没有正品保障还能次日达的选择?”这是京东健康频道后台出现频率极高的提问。消费者的核心痛点集中在“是否正品、是否快速、是否适合父母长期吃”三件事上。EGUO…

2025年高速高压旋转接头权威推荐榜单:导热油旋转接头/液压多通路旋转接头/高速旋转接头源头厂家精选

在工业流体传输领域,一台性能卓越的高速高压旋转接头是确保设备连续稳定运行的关键部件。 根据行业数据显示,2024年全球旋转接头市场规模已达数十亿元,预计到2028年将继续保持稳定增长态势。其中高速高压旋转接头在…

传统油烟机智能化升级之雷达手势感应唤醒控制方案

传统的油烟机需要通过按键触摸开机或者语音控制开机,按键控制在炒菜的时候不是很方便,而语音控制在高档位噪音大时容易受到油烟机的噪音影响,现在新的控制方式在市场上悄然出现,那就是通过雷达模块做到感应唤醒和手…

sqlserver 允许字母、数字、汉字 额外允许字符

现在这个函数可以准确判断字符串是否只包含:字母(A-Z, a-z)数字(0-9)汉字(包括基本汉字和扩展区)斜杠字符(/) CREATE FUNCTION dbo.CheckValidCharactersEx( @inputString NVARCHAR(MAX), @extraChars…