Gamma & Linear Color Space 概要
技术综合 2195 1
实名

通过了实名认证的内容创造者

发布于 2019-3-10 16:39:00

您需要 登录 才可以下载或查看,没有账号?注册

x
网上介绍颜色空间的内容有很多,这里就不做过多介绍了,只针对Unity做个简单的概述吧。

Gamma校正

首先提一下,为什么需要Gamma校正, 有两种说法,一种从显示器的工作原理上:显示器呈现的亮度并不是和电压成线性关系增长的; 一种是从人类的视觉感受上:人眼对亮部的变化比暗部更敏感。 详细介绍:Link:https://www.cambridgeincolour.com/tutorials/gamma-correction.htm

sRGB纹理

可以理解为在Gamma空间制作的纹理,经过Gamma校正后存储的纹理。

Unity Gamma & Linear 工作流

Unity设置为Gamma空间
需要确保输入的贴图是Gamma 校正的,即sRGB贴图。纹理颜色直接传给shader,不会移除Gamma校正,但是shader中的计算仍然是线性的(0.25 + 0.25 = 0.5),所以着色的结果并不是真实准确的。但是着色结果在写入Frame Buffer之前会做一些修正,所以最后看起来还可以。 目前大部分的美术工具如果输出时不经过特别的设置,默认都是经过了Gamma校正的(这样就可以直接在显示器上显示),但也有某些特殊情况下贴图直接是在线性空间下的制作的,通常不直接作为显示,也没必要做转换了。

Unity设置为Linear空间

对于没有勾选sRGB选项的纹理,引擎直接将纹理颜色提交给shader, 计算过程是线性的,对于勾选了sRGB的纹理会采用sRGB Sampling 移除Gamma校正后提交给shader,一般内容为颜色的贴图是在Gamma空间制作的需要进行转换,比如diffuse & albedo,即要勾选sRGB选项。 对于内容为数值的贴图来说,这部分贴图在美术工具中导出的结果就是线性的,比如Substance导出的Metallic贴图,Roughness贴图,即不需要进行Gamma转化就可以直接使用。 另外线性空间在渲染的最后一步会多一个Frame Buffer的Gamma校正操作,校正后提交给显示器显示。

1.jpg

Gamma & Linear 颜色空间 的问题

- Gamma空间中颜色的计算是非线性的, 对亮度的Intensity更敏感,可以说相对Linear空间更白。
- 颜色的混合问题:
Gamma空间中错误的颜色混合结果:

2.jpg

Linear空间中正确的颜色混合结果:


- 由于Gamma颜色空间中非线性的原因所以导致了PBR的计算结果并不准确,PBR需要在线性的颜色空间中计算。
- Gamma空间的计算没有过多的转化计算,效率要高于Linear。
- 并不是所有设备都支持linear空间, Android设备需要支持OpenGL ES 3.0和至少Android 4.3的系统,IOS需要Metal graphics API(系统至少为IOS 8)。在2016年底统计有38.9%的Android设备和28.9%的IOS设备无法使用Linear颜色空间。

官方文档:


本文出自知乎的Untiy Shader


你就在那里,默默望着你
使用道具 <
qq_四季_RvW  发表于 2019-3-10 22:27:11  
2#
回复 收起回复
使用道具
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表