zoukankan      html  css  js  c++  java
  • Unity Linear Gamma色彩空间矫正测试

    Gamma和Linear修正的问题相信网上已经有很多文章了。简单来说显示器的颜色输出不是线性的,根据硬件参数和输出颜色

    信息拟合曲线是x^2.2,因此会使用一个x^0.45曲线将其拟合回线性。

    因为0.5^0.45 = 0.73,0.5^2.2 = 0.217,我们可以通过一张0.5rgb的灰度图放Unity中观察变亮还是变暗

    来判断Unity在线性空间下做了哪些操作,以及参数配置是否正确。


    这里进入URP渲染管线,并设置为Linear线性颜色空间进行测试:

    测试1:一张图片在ps里制作成(127,127,127)的纯色,导入Unity。不勾选sRGB,输出颜色较亮,勾选sRGB,输出颜色正常

    结论:最终颜色输出时可能有gamma0.45处理。

    测试2:frag里输出颜色为0.5,该shader最终屏幕输出时,输出颜色较亮

    结论:进一步确定输出时有gamma0.45(pow(x,0.45))的处理。

    测试3:增加一个UV偏移的shader参数值,在Gamma颜色空间和Linear颜色空间下切换查看,无区别

    结论:颜色空间的修正处理类似滤镜,而正常传入Shader的字段数值不会做编解码,不参与显示相关的数值也不用做

    纠正。

    测试4:增加一个float类型的shader字段,直接输出在frag里,并将参数值设为0.5。输出颜色较亮,

    而给参数加上[Gamma]前缀,输出时颜色正常。

    结论:因为最终输出时屏幕会有一步gamma0.45处理,所以给常规参数追加一个gamma2.2处理,

    这样输出就是原始颜色了(加上[Gamma]相当于pow(x,2.2))。

    测试5:shader里有一处逻辑判断,传入图片颜色为0.5且误差0.1以内时才能进入if。随后传入这样一张0.5的图片,

    不勾选sRGB,结果正确,进入if。然后勾选sRGB,结果错误,没有进入if。

    结论:勾选sRGB相当于加了修正,此时不应再参与逻辑计算。应该去掉sRGB勾选,才是原始数值。

    或者手动调用LinearToGamma22转回。

    所以不用于图像输出的图片,如噪波,就不需要勾选sRGB(不勾选sRGB也叫做保持Linear)。不用于图像输出的shader字段,如UV偏移值

    就不用处理。用于图像输出的shader字段,如图像叠色,需要加[Gamma]前缀或者手动调用Gamma22ToLinear。

    同样,用于显示输出的图像如果中途要进行逻辑计算,需要调用LinearToGamma22转回原始数值。

    例如一些手游项目会合并多张贴图到一张,这就导致了Linear和sRGB混在一张图片内,这时候就需要代码里手动去转了。

    补充:关于RT和Texture2D的色彩空间转换,RT只需要设置RenderTextureReadWrite参数,

    颜色相关数据选择sRGB,非颜色相关数据选择Linear。而Texture2D在构造函数里,设置Linear参数true false即可。

  • 相关阅读:
    React在componentDidMount里面发送请求
    React 术语词汇表
    React里受控与非受控组件
    React和Vue等框架什么时候操作DOM
    【LeetCode】79. Word Search
    【LeetCode】91. Decode Ways
    【LeetCode】80. Remove Duplicates from Sorted Array II (2 solutions)
    【LeetCode】1. Two Sum
    【LeetCode】141. Linked List Cycle (2 solutions)
    【LeetCode】120. Triangle (3 solutions)
  • 原文地址:https://www.cnblogs.com/hont/p/15329125.html
Copyright © 2011-2022 走看看