伽马空间与线性空间的区别

线性空间

首先,我们需要知道什么是线性色彩空间。简单地说,这意味着数值强度值与其感知强度成比例地对应。这意味着可以正确添加和增加颜色。没有该属性的颜色空间称为“非线性”。下面是一个示例,其中强度值在线性和非线性颜色空间中加倍。虽然线性空间中的相应数值是正确的,但在非线性空间中(gamma = 0.45,稍后会详细介绍),我们不能简单地将值加倍以获得正确的强度。

线性和非线性空间中深灰色正方形的强度加倍

线性和非线性空间中深灰色正方形的强度加倍

伽玛空间

对伽马的需求有两个主要原因:首先是屏幕对强度具有非线性响应。另一个是人眼可以更好地区分深色阴影比浅色阴影。这意味着当图像被压缩以节省空间时,我们希望以牺牲较轻的强度为代价,以获得更高的暗强度精度。这两个问题都可以使用伽马校正来解决,也就是说,图像中每个像素的强度都通过幂函数进行。具体来说,伽马是应用于图像的功率的名称。

pow(x, gamma) 的图形

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() 来完成的。请注意,此方法的计算成本很高,因此请注意目标设备的功能,并仅在需要时使用它。

总结

总的来说,伽马空间产生的主要原因是,人眼对明暗色域的辨识度不一样,有时候会对图像进行伽马校正(即对图像进行非线性的处理)

线性空间则是模拟真实的光照,使图像更加真实

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值