【Unity URP】管线升级:解决色彩空间变化带来的问题

写在前面

这其实是一个之前转管线时遇到的问题,后来解决了,但是这篇文章一直没发出来,,现在来补一下发出!

(另外!!为了督促自己,,立下flag一直要记录学习内容,3天内至少发一篇技术性的文章~)

问题叙述

之前把天空盒从Build-in挪到URP管线下时,出现了一个问题,如下:

固定管线
URP管线

颜色完全不对了!挪到了URP下后颜色整体有一种变浅、变暗的感觉。这就涉及到色彩空间的东西。虽然之前也专门学习过色彩空间相关的知识:【技术美术图形部分】2.1 色彩空间,比较硬核。。。直到这次,我才真正明白色彩空间到底影响了什么!

1 色彩空间

Build-in和SRP两个管线默认的色彩空间是不同的:Build-in是Gamma Space,而SRP打造的URP和HDRP是Linear Space,色彩空间的话也可以自己在Player下修改,

对比

 配合下面的流程图食用:

截图自 参考文章
  • 伽马空间

不会对计算的输入和计算的输出做任何改变,全程保持Gamma0.45(1/2.2)空间下的数值进行计算

  • 线性空间

会对输入部分做Gamma2.2处理,得到Gamma1.0下的线性值进行计算,再对计算的输出部分做Gamma0.45处理,还原到0.45空间下

2 解决颜色变淡方案

颜色变淡的原因就是输入颜色没有预先转化到Gamma1.0的线性值。

天空盒的颜色我是脚本传给shader的,需要在脚本传递Color参数给shader时,带上.linear,转化成线性值:

关于.linear

关于Unity脚本的Color类变量,参考UnityEngine.Color - Unity 脚本 API

3 纹理是否勾选sRGB

储存颜色信息的纹理

这里也是另一个问题了:我的天空盒里月亮是找的一张Texture2D纹理,在URP管线下勾选sRGB和不勾选的区别:

原贴图
勾选了sRGB
没勾选sRGB

因此总结出:项目中,如果导入的Texture2D纹理会在Game窗口展示出色彩,那么都要勾选上sRGB:

储存非颜色信息的纹理

指的是噪声纹理等等这种仅仅是某个通道作为影响因子输入的。通过尝试我发现这类纹理不要勾选sRGB。

例如我实现星空用到了一张噪声纹理:

没勾选sRGB
勾选了sRGB

对于第3小节更加详细的解释:

截图自 参考文章

参考

URP线性空间颜色管理 - 知乎 (zhihu.com)

Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)

Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)

猜你喜欢

转载自blog.csdn.net/qq_41835314/article/details/129099818