Unity Shader 中 ColorSpaceDouble 是啥意思

着色器中的 unity_ColorSpaceDouble 变量。它的核心作用是提供一个与颜色空间无关的固定倍数值,帮助你在不同渲染环境下保持视觉效果一致 

1. 📊 它会根据当前颜色空间自动调整数值

它的值在不同的颜色空间下是不同的,这是为了模拟人眼对亮度感知的非线性特性 :

  • 当项目处于 Gamma 色彩空间 时,它等于 2.0 。

  • 当项目处于 Linear 色彩空间 时,它的 RGB 值会变成约 4.594(2的2.2次方,即 2^2.2),以补偿伽马校正带来的影响 。

2. 🎯 它的主要用途:修正颜色相乘导致的变暗问题

在着色器开发中,最常遇到的情况是混合两张纹理,例如 最终颜色 = 主纹理 * 细节纹理。由于颜色值都在 0 到 1 之间,直接相乘会使结果变暗,所以通常需要乘以 2 来恢复原始亮度 。

如果直接写死一个 * 2.0,在 Linear 空间下,由于颜色采样时经过了伽马校正,最终结果会是错误的(偏暗)。此时,就需要乘以 4.594 才能得到和在 Gamma 空间下乘以 2.0 相同的视觉效果 。

ColorSpaceDouble 的作用就是替你完成这个判断,你不需要关心项目设置,直接用 c.rgb *= tex2D(_Detail, uv).rgb * unity_ColorSpaceDouble.rgb; 即可在所有色彩空间下得到正确结果

有一点值得留意,ColorSpaceDouble 的 RGB 值会变,但它的 Alpha(A)通道在 Gamma 和 Linear 空间下都是 2.0 。如果你想应用一个比较柔和的提亮效果,有时可以乘以 unity_ColorSpaceDouble.a 来替代 RGB 。

在 URP 中,unity_ColorSpaceDouble 不是一个内置的变量

这是因为 URP 为了精简和高效,使用了全新的 Core.hlsl 库,没有包含这个在旧版内置渲染管线中的辅助宏。

如何在 URP 中实现相同功能?

你可以在 URP 的着色器中手动定义它,原理与之前完全相同,即根据颜色空间(Gamma 或 Linear)来设置正确的倍增系数。

参考下面的代码(来源于一个 URP 天空盒着色器的实现 ),你就明白怎么做了:

// 在 HLSL 代码开始处,根据颜色空间定义 unity_ColorSpaceDouble
#ifdef UNITY_COLORSPACE_GAMMA
    #define unity_ColorSpaceDouble half4(2.0, 2.0, 2.0, 2.0)
#else // Linear 空间下的值
    #define unity_ColorSpaceDouble half4(4.59479380, 4.59479380, 4.59479380, 2.0)
#endif

// 在你的片元着色器中使用它
half4 frag (v2f i) : SV_Target
{           
    half4 tex = SAMPLE_TEXTURECUBE(_Tex, sampler_Tex, i.texcoord);
    half3 c = DecodeHDREnvironment(tex, _Tex_HDR);
    
    // 直接使用你定义的 unity_ColorSpaceDouble
    c = c * _Tint.rgb * unity_ColorSpaceDouble.rgb;
    
    c *= _Exposure;
    return half4(c, 1);
}
  • 手动定义的便利性:手动定义让你在编写 URP 着色器时,可以继续沿用 unity_ColorSpaceDouble 这个直观的名字,保持代码习惯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值