news 2026/4/23 21:19:42

【URP】Unity[后处理]色彩调整ColorAdjustments

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【URP】Unity[后处理]色彩调整ColorAdjustments

4.X时代的色彩校正曲线和3D查找纹理技术,早期通过手动调节RGB通道曲线实现基础调色功能,而在URP中已整合为标准化体积框架下的模块化组件。

底层原理

Unity URP中的Color Adjustments后处理效果基于渲染管线中的片段着色器操作,其核心原理是通过线性空间下的数学变换调整像素颜色值。该效果在色调映射阶段前执行,作用于HDR颜色缓冲区的数据

‌曝光调整‌:通过pow(2, postExposure)对RGB通道进行指数级亮度缩放,模拟相机曝光补偿机制。计算过程发生在线性颜色空间,避免伽马校正干扰。

‌对比度计算‌:采用中间灰值(0.5)作为基准点,使用saturate((color.rgb - 0.5) * contrast + 0.5)公式扩展或压缩动态范围,其中saturate确保结果在[0,1]范围内。

‌色调/饱和度‌:将RGB转换到HSV色彩空间,调整H分量实现色相旋转,S分量控制颜色纯度,最后转回RGB空间.

实现示例

以下为URP内置着色器中颜色调整的核心代码逻辑:

‌曝光计算‌:采用2的幂次方实现物理正确的曝光模拟

‌HSV转换‌:通过几何插值法避免三角函数运算提升性能

‌动态范围保护‌:使用step()和saturate()防止数值溢出

ColorAdjustment.hlsl

// 线性空间下的颜色处理函数

half3 ApplyColorAdjustments(half3 color, float postExposure, float contrast, float hueShift, float saturation)

{

// 曝光调整

color *= exp2(postExposure);

// 对比度计算

color = (color - 0.5h) * contrast + 0.5h;

// RGB转HSV

half4 k = half4(0.0, -1.0/3.0, 2.0/3.0, -1.0);

half4 p = lerp(half4(color.bg, k.wz), half4(color.gb, k.xy), step(color.b, color.g));

half4 q = lerp(half4(p.xyw, color.r), half4(color.r, p.yzx), step(p.x, color.r));

float d = q.x - min(q.w, q.y);

float e = 1.0e-10;

half3 hsv = half3(abs(q.z + (q.w - q.y)/(6.0 * d + e)), d/(q.x + e), q.x);

// 色相/饱和度调整

hsv.x += hueShift;

hsv.y *= saturation;

// HSV转RGB

return HsvToRgb(hsv);

}

该效果在URP渲染流程中通过Volume系统注入参数,最终由FinalPost.shader在渲染目标上执行全屏绘制。色彩调整的运算顺序遵循:曝光→对比度→色调/饱和度→颜色滤镜,确保各阶段调整互不干扰.

核心参数与功能

‌Post Exposure‌:以EV单位调整场景整体曝光度,作用于HDR效果后、色调映射前,不影响处理链中其他效果。

‌Contrast‌:扩展(正值)或收缩(负值)色调范围,增强视觉层次感。

‌Color Filter‌:通过颜色选择器对渲染结果进行乘法着色,实现整体色调偏移。

‌Hue Shift‌:全局调整所有颜色的色相值,常用于风格化渲染。

‌Saturation‌:控制颜色强度,负值可生成灰度图像。

实现流程示例

‌创建后处理体积‌

添加空GameObject并挂载Volume组件

新建配置文件(如ColorProfile),通过Add Override > Post-processing添加Color Adjustments效果

‌相机配置‌

启用相机的Post Processing选项

在Volume Mask中匹配后处理体积的图层(如PostProcessLayer1)

‌参数调试‌

调整Contrast至1.2增强场景对比度

设置Color Filter为浅蓝色实现冷色调风格化

实际应用案例

‌恐怖游戏‌:降低饱和度至-30并微调色相,营造压抑氛围

‌开放世界‌:动态调整曝光度模拟昼夜光照变化

以下为完整URP实现代码示例:

脚本挂载至含Volume组件的对象

通过Inspector动态修改参数值

支持运行时效果切换

ColorAdjustmentSetup.cs

using UnityEngine;

using UnityEngine.Rendering;

using UnityEngine.Rendering.Universal;

public class ColorAdjustmentSetup : MonoBehaviour

{

[SerializeField] private VolumeProfile profile;

[SerializeField] private float contrast = 1.2f;

[SerializeField] private Color colorFilter = new Color(0.8f, 0.9f, 1f);

void Start()

{

if (profile.TryGet(out ColorAdjustments adjustments))

{

adjustments.contrast.value = contrast;

adjustments.colorFilter.value = colorFilter;

}

}

}

该技术通过分离渲染管线与美术控制,实现了非破坏性工作流,成为现代游戏开发的标准实践

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

手握方向盘急打方向时,你有没有想过轮胎和车身的相互作用到底藏着什么玄机?今天咱们用Matlab扒开车辆动力学的底裤,看看那个决定车辆会不会失控的神秘相平面

基于Matlab的车辆稳定性相平面图绘制程序 ①根据确定的简化魔术公式轮胎模型,建立车辆非线性二自由度运动微分方程,并进而对相平面图进行绘制。 ②包括横摆角速度与质心侧偏角的相平面,以及质心侧偏角速度与质心侧偏角的相平面。 附带说明文档…

作者头像 李华
网站建设 2026/4/17 12:25:16

三菱FX5U与3台三菱E700变频器通讯实战

三菱FX5U与3台三菱E700变频器通讯程序(SL5U-24) 通讯说明:用三菱FX5U的PLC实现与3台三菱E700变频器modbus通讯 器件:三菱FX5U PLC,3台三菱E700变频器,昆仑通态TPC7022NI触摸屏 功能:触摸屏上设置每台频率,监…

作者头像 李华
网站建设 2026/4/17 6:04:26

Profiling 专项

Profiling 工具 https://github.com/iovisor/bcc

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

如何完成一个方便简单的Arduino共阳极数码管实验(从0~9依次循环亮起)

文章目录 实验演示共阴极数码管和共阳极数码管的区别所需器材连接草图程序代码代码说明代码功能概述核心数据结构关键函数逻辑 小结 实验演示 共阴极数码管和共阳极数码管的区别 在开始实验之前,请让我简单解释一下共阴极数码管和共阳极数码管的区别,这…

作者头像 李华
网站建设 2026/4/23 13:39:39

Sniffnet容器化部署终极指南:3步搞定网络流量监控

还在为复杂的网络分析工具配置头疼吗?Sniffnet容器化部署让你在5分钟内拥有专业级网络流量分析能力!告别环境依赖冲突,开启零基础网络分析新时代 🚀 【免费下载链接】sniffnet Sniffnet 是一个能让你轻松监测网络流量的应用。你可…

作者头像 李华
网站建设 2026/4/17 7:43:53

基于Python+Django的毕业设计选题系统(源码+lw+部署文档+讲解等)

课题介绍本课题聚焦高校毕业设计选题环节的管理痛点,设计实现一套基于 PythonDjango 框架的毕业设计选题系统。传统毕业设计选题多依赖线下提交、人工统计,易出现选题冲突、信息不对称、流程效率低等问题,难以适配高校规模化教学管理需求。系…

作者头像 李华