Gamma 和 Linear Space的设置 Unity

Gamma 和 Linear

至于为什么会有 Gamma校正这个问题,网上有很多资料,这里就不赘述了
可以看着这个视频Gamma校正与线性工作流入门讲解
下面就讲我们如何选择在Unity中的色彩空间
首先 进入 Edit ->Project Settings -> Player ->Other Setting -> Color Space
Gamma 和 Linear Space的设置 Unity_第1张图片
这里的两个选项就是 Gamma 和 Linear 空间了。

下面说的都是 基于导入的图片都是SRGB格式的,现在一般图片都是这个格式了,当然如果是法线厚度黑白图这些就不需要了。
1. Gamma Space
在Gamma空间下,可以理解为 Unity对导入的图片什么都不管不做处理,也就是说你勾不勾选图片上的SRGB选项都没影响,需要你手动的进行计算。就是 在shader中如果想将 图片从Gamma空间转到linear空间和光照 进行运算,这就需要你自己手动来实现
Gamma 和 Linear Space的设置 Unity_第2张图片

. 是自己手动用pow(color, 2.2)从Gamma-> Linear 最后在fragment中输出颜色时 pow(color, 1/2.2) 从Linear-> Gamma.
. 是使用Unity自带的函数进行实现,一般来说pow运算还是比较耗性能的尤其是在像手机平台这种,在UnityCG.cgind文件下有这两个函数的定义

inline half3 LinearToGammaSpace (half3 linRGB)     
{         
     linRGB = max(linRGB, half3(0.h, 0.h, 0.h));     
     // An almost-perfect approximation from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1         
     return max(1.055h * pow(linRGB, 0.416666667h) - 0.055h, 0.h);         
    // Exact version, useful for debugging.         
    //return half3(LinearToGammaSpaceExact(linRGB.r), LinearToGammaSpaceExact(linRGB.g), LinearToGammaSpaceExact(linRGB.b));     
}
inline half3 GammaToLinearSpace (half3 sRGB) 
{
     // Approximate version from http://chilliant.blogspot.com.au/2012/08/srgb-approximations-for-hlsl.html?m=1     
    return sRGB * (sRGB * (sRGB * 0.305306011h + 0.682171111h) + 0.012522878h);     // Precise version, useful for debugging.     
    //return half3(GammaToLinearSpaceExact(sRGB.r), GammaToLinearSpaceExact(sRGB.g), GammaToLinearSpaceExact(sRGB.b)); 
}

Unity自带的Gamma-> Linear函数没有使用pow运算,而是使用一种函数来拟合这种曲线的,当然你可以自己去画图软件上取试试. 自带的函数一般是要比自己写的方法要好用,建议还是用这两个函数
如果不进行以上操作的话,物体身上的亮度就会呈现一个pow(x, 1/2.2)曲线的一个突然递增(其实这个函数就是导出图片时做的Gamma压缩操作RGB->SRGB)。我感觉哈,其实这样的话也无伤大雅,自己可以试试

2. Linear Space
在这模式下,当你勾选了SRGB时, Unity在导入shader颜色运算前,就会把你的图片自动从 Gamma->Linear 转换 ,最后输出时也是自动的从Linear->Gamma转换。而不勾选SRGB的图片 则不会进行这个转换

区别
所以他们的区别在我看来,就是unity 有没有自动帮你进行转换
Linear Space下在手机端会有些限制如:
在Android上,Linear只在OpenGL ES 3.0和Android 4.3以上支持,iOS则只有Metal才支持。

你可能感兴趣的:(unity,c#)