着色器中的 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这个直观的名字,保持代码习惯。

624

被折叠的 条评论
为什么被折叠?



