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即可。

  • 相关阅读:
    专题实验 Toad 用户的创建与管理( 包括 role 等 )
    专题实验 字符集(全球化支持)
    Toad 所有 菜单说明(太多)
    java 调试
    java 基础数据结构
    HeadFirst Jsp 09 (JSTL)
    HeadFirst jsp 08 无脚本JSP
    14 多线程
    Struts2配置
    Struts框架搭建时所遇到的问题
  • 原文地址:https://www.cnblogs.com/hont/p/15329125.html
Copyright © 2011-2022 走看看