线性空间
首先,我们需要知道什么是线性色彩空间。简单地说,这意味着数值强度值与其感知强度成比例地对应。这意味着可以正确添加和增加颜色。没有该属性的颜色空间称为“非线性”。下面是一个示例,其中强度值在线性和非线性颜色空间中加倍。虽然线性空间中的相应数值是正确的,但在非线性空间中(gamma = 0.45,稍后会详细介绍),我们不能简单地将值加倍以获得正确的强度。
线性和非线性空间中深灰色正方形的强度加倍
伽玛空间
对伽马的需求有两个主要原因:首先是屏幕对强度具有非线性响应。另一个是人眼可以更好地区分深色阴影比浅色阴影。这意味着当图像被压缩以节省空间时,我们希望以牺牲较轻的强度为代价,以获得更高的暗强度精度。这两个问题都可以使用伽马校正来解决,也就是说,图像中每个像素的强度都通过幂函数进行。具体来说,伽马是应用于图像的功率的名称。
pow(x, gamma) 的图形
看上图,很明显,除了 1 之外的任何伽马都是非线性空间。
应用于中心图像的两个常见伽玛值
大多数图像在存储时都应用了 0.45 的伽马值,这将具有上图左图所示的效果。图像的较暗区域现在使用更大的值范围记录,同时压缩明亮范围。像这样存储的图像位于“伽马空间”中。例如,图像中的中性灰色的数值强度不是 0.5,而是在 0.73 左右,而纯白色和黑色保持不变。这是几乎所有数码相机以及图像编辑应用程序等的默认行为。事实上,您在计算机上看到的几乎每张图像都应用了该伽马。
您可能想知道为什么图像显示正确,并且看起来不太亮。这就是显示器非线性响应的用武之地。CRT屏幕,简单地通过它们的工作方式,应用大约2.2的伽马,现代LCD屏幕旨在模仿这种行为。伽马值为2.2,倒数为0.45,当应用于变亮的图像时,它们将变暗,留下原始图像。
例如,左上图代表存储在计算机上的内容,当显示该图像时,结果看起来像中心图像。左侧图像已被“伽玛校正”,这意味着它具有伽玛值,以便在将屏幕的伽玛应用于图像后正确显示。相反,如果计算机正在存储尚未进行伽马校正的中心图像,则显示的结果看起来像正确的图像,这显然是不需要的行为。
色彩空间和渲染管线
在渲染中使用 gamma 管线时,纹理将传递到着色器中,并进行 gamma 校正。接下来计算照明。之后,最终图像被输出到显示器,并通过显示器的伽马值进行调整。这种行为虽然简单,但在物理上是不正确的。在现实生活中,光的行为是线性的,这意味着来自多个光源的每个贡献加在一起都会给出正确的强度。因此,着色是在线性空间中完成的,但在伽马管线中,输入的颜色和纹理仍保留在伽马空间中。这意味着阴影的结果并不真正准确,但在显示器校正后,它通常足够好。然而,随着对沉浸式、照片真实渲染的需求不断增加,这不再是一种合适的方法。
因此,PBR 的典型做法是使用线性管道。在这里,输入颜色和纹理在着色之前删除了伽马校正,将它们放入线性空间。着色时,结果在物理上是正确的,因为着色过程和输入都位于同一空间中。之后,任何后期效果都应在帧仍处于线性空间时计算,因为后期效果通常是线性的,非常类似于着色。最后,对图像进行伽马校正,以便在显示器的伽马调整后具有适当的强度。
伽马和线性管道的比较
在上面,您可以看到简单球体上伽马管线和线性管线的最终结果之间的差异。请注意伽马空间中更明亮的镜面反射高光和更强的光线衰减。这些都是不切实际的行为的例子,将使实现照片真实感变得困难。
UNITY 中的色彩空间
幸运的是,Unity 能够非常轻松地在色彩空间之间切换,并且对于许多项目来说,它们都可以与您的渲染管线无缝协作。默认情况下,Unity 使用伽玛空间,因为只有 PC、Xbox 和 PlayStation 平台支持线性渲染。对于这些平台,要在线性和伽马空间之间切换,请转到:
编辑 -> 项目设置 ->播放器 -> 其他设置
在这里,将有一个名为“色彩空间”的选项,您可以在其中选择线性或伽玛。就这么简单!着色器现在应接收非伽玛校正纹理。请注意,如果您的项目已经在开发中,您可能需要重新设计照明和各种纹理才能产生良好的效果,因为渲染的场景看起来与以前不同。如果您烘焙了任何光照贴图,则需要重新烘焙它们才能正确。
使用线性色彩空间和 HDR 时,所有后期效果都将由 Unity 在完整的线性空间中完成。但是,当仅启用线性色彩空间时,Unity 将使用伽玛帧缓冲区,但幸运的是,在读取和写入此缓冲区时,Unity 将自动正确转换值的颜色空间,以便图像效果仍然在线性空间中完成。
尽管 Unity 在某些平台(如移动设备)上不支持默认线性管道。可以在着色器中自己执行此操作。这是通过将 pow() 函数应用于 gamma 校正的输入纹理以将输入转换为线性空间来完成的,并在返回结果以将其放回 gamma 空间之前再次应用 pow() 来完成的。请注意,此方法的计算成本很高,因此请注意目标设备的功能,并仅在需要时使用它。
总结
总的来说,伽马空间产生的主要原因是,人眼对明暗色域的辨识度不一样,有时候会对图像进行伽马校正(即对图像进行非线性的处理)
线性空间则是模拟真实的光照,使图像更加真实