dede网站首页,天津建设工程信息网官网平台,网站建设取得实效,手机记事本做网站ColorCurves 是 Unity 通用渲染管线(URP)中的一种高级颜色分级工具#xff0c;它允许通过曲线精细调整图像的色相、饱和度和亮度。这种工具最初在专业影视后期软件(如 Fusion)中成熟应用#xff0c;后被引入游戏引擎用于实时渲染的色彩控制。ColorCurves 提供了8条独立曲线它允许通过曲线精细调整图像的色相、饱和度和亮度。这种工具最初在专业影视后期软件(如 Fusion)中成熟应用后被引入游戏引擎用于实时渲染的色彩控制。ColorCurves 提供了8条独立曲线包括Master(整体亮度)功能整体调整图像的亮度和对比度。实现通过调整曲线形状控制全局亮度曲线向上提升亮度向下降低亮度Red/Green/Blue(单通道调整三条曲线)功能分别单独调整红、绿、蓝通道的亮度和色彩平衡。实现针对分量进行独立调节影响图像中红、绿蓝区域的显色强度HueVsHue(色调替换 色相-色相曲线)功能基于色相替换颜色如将红色替换为蓝色。实现通过映射原始色相到目标色相实现颜色转换HueVsSat(色调饱和度调整 色相-饱和度曲线)功能根据色相调整特定颜色的饱和度。实现选择特定色相范围后增加或降低其饱和度SatVsSat(饱和度对比 饱和度-饱和度曲线)功能基于当前饱和度进一步调整饱和度。实现对低饱和度区域增强或高饱和度区域抑制实现非线性调整LumVsSat(亮度饱和度关系 亮度-饱和度曲线)功能根据亮度调整饱和度如增强暗部饱和度。实现在低亮度区域提升饱和度以增强视觉对比或在高亮度区域降低饱和度避免过曝发展历史颜色曲线技术起源于电影工业的后期调色流程早期在 DaVinci Resolve 等专业调色软件中实现。Unity 在 2017 年引入 Post-processing Stack v1 时首次包含了基础曲线调整2019 年 URP 正式版将其整合为 ColorCurves 模块并增加了针对游戏优化的 ACES 色彩空间支持。实现原理ColorCurves 在渲染管线的后处理阶段工作位于色调映射之前。它通过以下步骤实现将输入图像分解为 HSL 分量对每个分量应用预定义的曲线变换重新组合分量并输出到下一处理阶段曲线映射原理ColorCurves通过8条独立曲线对图像进行分通道处理每条曲线采用256个控制点的查找表(LUT)实现非线性映射。例如Master曲线采用x轴(输入亮度)到y轴(输出亮度)的映射关系通过贝塞尔插值算法实现平滑过渡。贝塞尔曲线通用公式对于n阶贝塞尔曲线其参数方程为$B(t)\sum_{i0}{n}\binom{n}{i}(1−t)t^iP_i,t\in[0,1]$其中$P_i$为控制点共n1个$\binom{n}{i}$为组合数t为参数控制曲线上的位置。常见类型线性 1阶两点间直线公式为$B(t)(1−t)P_0tP_1$二次 2阶3个控制点公式为$B(t)(1−t)2P_02t(1−t)P_1t2P_2$三次 3阶4个控制点公式为$B(t)(1−t)3P_03(1−t)2tP_13(1−t)t2P2t3P_3$三次贝塞尔曲线因平衡计算复杂性和灵活性成为图形学中最常用的类型实现方法递归计算通过德卡斯特里奥算法De Casteljaus algorithm逐步插值中间点矩阵表示将三次贝塞尔曲线表示为控制点与基函数的矩阵乘法代码示例Unity/C#注实际应用中需处理浮点精度和性能优化csharppublic Vector3 CalculateBezierPoint(Vector3 p0, Vector3 p1, Vector3 p2, Vector3 p3, float t) {float u 1 - t;return u*u*u * p0 3*u*u*t * p1 3*u*t*t * p2 t*t*t * p3;}通道处理流程RGB通道分离先将图像分解为R/G/B三个通道channelR (R,0,0)channelG (0,G,0)channelB (0,0,0)HLSL中常用亮度公式Luminance0.2126×R0.7152×G0.0722×B该公式基于CIE 1931色彩空间的人眼感知权重RGB_Separate.hlslhlslTexture2D InputTexture : register(t0);SamplerState LinearSampler : register(s0);struct PS_Input {float4 Position : SV_POSITION;float2 UV : TEXCOORD;};// 红色通道分离float4 PS_RedChannel(PS_Input input) : SV_TARGET {float3 color InputTexture.Sample(LinearSampler, input.UV).rgb;return float4(color.r, 0, 0, 1); // 仅保留R分量}// 绿色通道分离float4 PS_GreenChannel(PS_Input input) : SV_TARGET {float3 color InputTexture.Sample(LinearSampler, input.UV).rgb;return float4(0, color.g, 0, 1); // 仅保留G分量}// 蓝色通道分离float4 PS_BlueChannel(PS_Input input) : SV_TARGET {float3 color InputTexture.Sample(LinearSampler, input.UV).rgb;return float4(0, 0, color.b, 1); // 仅保留B分量}// 亮度计算float4 PS_Luminance(PS_Input input) : SV_TARGET {float3 color InputTexture.Sample(LinearSampler, input.UV).rgb;float lum dot(color, float3(0.2126, 0.7152, 0.0722));return float4(lum.xxx, 1); // 灰度输出}曲线应用主通道Master曲线同时影响所有通道作为全局亮度调整曲线直接对RGB三通道进行统一映射。公式为Outputf_master(Input)其中Input是原始亮度值0-1f_master是用户定义的曲线函数分通道Red/Green/Blue曲线分别处理对应通道HueVsHue曲线实现色相替换效果通过角度偏移改变特定色相。HSV空间中的公式H_outH_inf_hue(H_in)∗360°f_hue是定义在0-1范围的曲线输出值作为角度偏移量。HueVsSat曲线控制不同色相区域的饱和度增强/减弱: S_outS_in∗(1f_sat(H_in))f_sat曲线输出-1到1的值负值降低饱和度正值增加。SatVsSat曲线非线性调整饱和度分布S_outf_satmap(S_in)直接重映射饱和度值常用于创建哑光效果。LumVsSat曲线基于亮度控制饱和度S_outS_in∗(1f_lum(L_in))L_in是HSL亮度值f_lum曲线控制不同亮度区域的饱和度变化ColorCurves.hlsl使用纹理采样实现曲线查找提升GPU执行效率RgbToHsv/HsvToRgb需自行实现标准色彩空间转换曲线参数通过纹理传入支持任意形状的调整曲线最终效果是各曲线调整的叠加组合在C#中可通过Shader.SetGlobalTexture传递曲线纹理或在CPU端实现类似算法处理图像数据。实际应用时通常配合UI控件让用户交互式调整曲线形状。// 输入参数Texture2D InputTexture;SamplerState LinearSampler;float4 HueVsHueCurve; // 曲线采样纹理float4 HueVsSatCurve;float4 SatVsSatCurve;float4 LumVsSatCurve;float3 ApplyColorCurves(float3 rgb){// 转换到HSV空间float3 hsv RgbToHsv(rgb);float hue hsv.x;float sat hsv.y;float lum GetLuminance(rgb);// HueVsHue处理float hueOffset SampleCurve(HueVsHueCurve, hue);hsv.x frac(hue hueOffset);// HueVsSat处理float satScale SampleCurve(HueVsSatCurve, hue) * 2.0 - 1.0;hsv.y sat * (1.0 satScale);// SatVsSat处理hsv.y SampleCurve(SatVsSatCurve, sat);// LumVsSat处理float lumSatScale SampleCurve(LumVsSatCurve, lum) * 2.0 - 1.0;hsv.y sat * (1.0 lumSatScale);// 返回RGB空间return HsvToRgb(hsv);}// 辅助函数float SampleCurve(float4 curve, float x){return curve.SampleLevel(LinearSampler, float2(x, 0), 0).r;}色相转换将RGB转换为HSV色彩空间处理HueVsHue等曲线HSVHue, Saturation, Value是一种基于人类视觉感知的直观颜色模型由色相H、饱和度S和明度V三个分量组成基本概念色相H表示颜色类型取值范围0°-360°如红色0°、绿色120°、蓝色240°通过色轮角度定位颜色。饱和度S表示颜色纯度0%为灰色100%为纯色数值越高颜色越鲜艳。明度V控制颜色亮度0%为黑色100%为最亮如白色需S0%、V100%模型特点六角锥体结构从RGB立方体演化而来色调H沿圆周分布饱和度S和明度V分别表示径向和轴向距离。符合直觉比RGB更接近传统绘画调色习惯适合直观调整颜色属性如Photoshop调色板。分量独立亮度V与颜色无关仅影响光照强度色调H和饱和度S互不干扰RGB转HSVHSV转RGBColorSpace.hlsl// RGB转HSVfloat3 RGBtoHSV(float3 rgb) {float cmax max(rgb.r, max(rgb.g, rgb.b));float cmin min(rgb.r, min(rgb.g, rgb.b));float delta cmax - cmin;float h 0;if (delta ! 0) {if (cmax rgb.r)h 60 * fmod(((rgb.g - rgb.b)/delta 6), 6);else if (cmax rgb.g)h 60 * ((rgb.b - rgb.r)/delta 2);elseh 60 * ((rgb.r - rgb.g)/delta 4);}float s (cmax 0) ? 0 : delta / cmax;return float3(h, s, cmax);}// HSV转RGBfloat3 HSVtoRGB(float3 hsv) {float c hsv.z * hsv.y;float x c * (1 - abs(fmod(hsv.x / 60, 2) - 1));float m hsv.z - c;float3 rgb;if (hsv.x 60) rgb float3(c, x, 0);else if (hsv.x 120) rgb float3(x, c, 0);else if (hsv.x 180) rgb float3(0, c, x);else if (hsv.x 240) rgb float3(0, x, c);else if (hsv.x 300) rgb float3(x, 0, c);else rgb float3(c, 0, x);return rgb m;}示例实现冷色调增强// 在Volume组件中添加ColorCurves重载var curves volumeProfile.AddColorCurves();curves.active true;// 调整蓝色通道曲线curves.blue.Override(new AnimationCurve(new Keyframe(0, 0),new Keyframe(0.5f, 0.7f),new Keyframe(1, 1)));// 降低暖色饱和度curves.hueVsSat.Override(new AnimationCurve(new Keyframe(0.1f, 0.8f),// 红色范围new Keyframe(0.6f, 1.2f)// 蓝色范围));该示例通过提升中间调蓝色和抑制红色饱和度实现电影级冷色调效果。伽马校正处理URP会在曲线处理前后自动执行伽马/线性空间转换确保颜色混合符合物理正确性。具体流程输入图像从sRGB转为线性空间应用所有曲线调整结果转换回sRGB空间输出性能优化采用计算着色器并行处理LUT生成每条曲线仅需1次纹理采样8条曲线共产生约0.3ms的性能开销1080p分辨率。建议避免每帧动态修改曲线控制点改为预烘焙多套曲线配置。完整示例ColorCurvesExample.csusing UnityEngine;using UnityEngine.Rendering;using UnityEngine.Rendering.Universal;[System.Serializable]public class ColorCurvesSettings{public AnimationCurve masterCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve redCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve greenCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve blueCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve hueVsHueCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve hueVsSatCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve satVsSatCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));public AnimationCurve lumVsSatCurve new AnimationCurve(new Keyframe(0f, 0f), new Keyframe(1f, 1f));}public class CustomColorCurvesRenderPass : ScriptableRenderPass{private Material m_Material;private ColorCurvesSettings m_Settings;public CustomColorCurvesRenderPass(Material material, ColorCurvesSettings settings){m_Material material;m_Settings settings;}public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData){if (m_Material null) return;CommandBuffer cmd CommandBufferPool.Get(Color Curves);// 设置曲线参数m_Material.SetTexture(_MasterCurve, CreateCurveTexture(m_Settings.masterCurve));m_Material.SetTexture(_RedCurve, CreateCurveTexture(m_Settings.redCurve));m_Material.SetTexture(_GreenCurve, CreateCurveTexture(m_Settings.greenCurve));m_Material.SetTexture(_BlueCurve, CreateCurveTexture(m_Settings.blueCurve));m_Material.SetTexture(_HueVsHueCurve, CreateCurveTexture(m_Settings.hueVsHueCurve));m_Material.SetTexture(_HueVsSatCurve, CreateCurveTexture(m_Settings.hueVsSatCurve));m_Material.SetTexture(_SatVsSatCurve, CreateCurveTexture(m_Settings.satVsSatCurve));m_Material.SetTexture(_LumVsSatCurve, CreateCurveTexture(m_Settings.lumVsSatCurve));// 执行后处理Blit(cmd, renderingData.cameraData.renderer.cameraColorTarget,renderingData.cameraData.renderer.cameraColorTarget, m_Material);context.ExecuteCommandBuffer(cmd);CommandBufferPool.Release(cmd);}private Texture2D CreateCurveTexture(AnimationCurve curve){Texture2D texture new Texture2D(256, 1, TextureFormat.RFloat, false);for (int i 0; i 256; i){float value curve.Evaluate(i / 255f);texture.SetPixel(i, 0, new Color(value, 0, 0, 0));}texture.Apply();return texture;}}使用流程在 Unity 中创建 Volume 对象并添加 Color Curves 效果调整各条曲线参数通过预览窗口实时查看效果参数详解与用例Master 曲线作用全局亮度调整用例修正整体曝光不足或过曝的场景RGB 曲线(Red/Green/Blue)作用单独调整各颜色通道用例修正色偏或创造风格化效果(如赛博朋克的蓝色调)HueVsHue作用基于输入色调替换输出色调用例将绿色植被改为秋季黄色HueVsSat作用调整特定色调的饱和度用例增强天空蓝色饱和度而不影响其他颜色SatVsSat作用调整饱和度对比用例使高饱和区域更鲜艳低饱和区域更灰LumVsSat作用基于亮度调整饱和度用例使暗部区域降低饱和度(电影感效果)实际应用技巧电影感调色使用 LumVsSat 降低暗部饱和度HueVsHue 微调肤色季节变换通过 HueVsHue 将绿色变为黄色/红色模拟秋季风格化效果夸张的 S 形 RGB 曲线创造高对比度画面色彩匹配Match 功能原理使用曲线匹配不同镜头的色彩ColorCurves 与 Unity 的 ACES 色彩空间配合使用时效果最佳能够保持更广色域的色彩关系