写在前面
这其实是一个之前转管线时遇到的问题,后来解决了,但是这篇文章一直没发出来,,现在来补一下发出!
(另外!!为了督促自己,,立下flag一直要记录学习内容,3天内至少发一篇技术性的文章~)
问题叙述
之前把天空盒从Build-in挪到URP管线下时,出现了一个问题,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/e7505639bc80d0e5cf968b50585b2e01.png)
![](https://i-blog.csdnimg.cn/blog_migrate/50ce32393d07cd56601e6b9954efdbba.png)
颜色完全不对了!挪到了URP下后颜色整体有一种变浅、变暗的感觉。这就涉及到色彩空间的东西。虽然之前也专门学习过色彩空间相关的知识:【技术美术图形部分】2.1 色彩空间,比较硬核。。。直到这次,我才真正明白色彩空间到底影响了什么!
1 色彩空间
Build-in和SRP两个管线默认的色彩空间是不同的:Build-in是Gamma Space,而SRP打造的URP和HDRP是Linear Space,色彩空间的话也可以自己在Player下修改,
对比
配合下面的流程图食用:
![](https://i-blog.csdnimg.cn/blog_migrate/cbd4c8ab3cc6f43994cbda618c62b38a.png)
-
伽马空间
不会对计算的输入和计算的输出做任何改变,全程保持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和不勾选的区别:
![](https://i-blog.csdnimg.cn/blog_migrate/83fd4d3890413ef009a11baee4730804.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ac8afeecf26e255f961714fdd881c7f7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/4e3ff65a61a3b19349dcc1103307b389.png)
因此总结出:项目中,如果导入的Texture2D纹理会在Game窗口展示出色彩,那么都要勾选上sRGB:
储存非颜色信息的纹理
指的是噪声纹理等等这种仅仅是某个通道作为影响因子输入的。通过尝试我发现这类纹理不要勾选sRGB。
例如我实现星空用到了一张噪声纹理:
![](https://i-blog.csdnimg.cn/blog_migrate/5bae9fc3aa26dd6e676b6bcb8ee0834d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/e6b2c8c09e26e6f9b4f75e6b9e41d894.png)
对于第3小节更加详细的解释:
![](https://i-blog.csdnimg.cn/blog_migrate/b1139f1662b4937612e887915274d49c.png)
参考
Unity内置管线升级URP之色彩空间(伽马、sRGB、Gamma Space和Linear Space)
Gamma、Linear、sRGB 和Unity Color Space,你真懂了吗? - 知乎 (zhihu.com)