线性照明(仅限专业版)

概述

线性照明指在所有输入呈线性的情况下照亮场景的过程。通常,存在将伽玛预先应用到其中的纹理,这表示,纹理在材质中进行采样时,呈非线性。如果这些纹理用于标准照明方程式,将导致方程式结果不正确,因为预计所有输入在使用前都呈线性。

线性照明指确保着色器的输入和输出都使用正确的色彩空间的过程,它可提高照明的准确性。

现有(伽玛)管道

在现有渲染管道中,所有颜色和纹理都在伽玛空间中采样,也就是说,在着色器使用图像或颜色之前,伽玛校正不会从其中移除。由于这一原因,着色器中的输入位于伽玛空间,但在照明方程式使用这些输入时,均视其位于线性空间中,最终未将伽玛校正应用到最终像素。大部分时候,上述现象看似合理,因为两种错误从某种程度相互抵消。但这是不正确的。

线性照明管道

如果启用线性照明,则会提供 着色器工程的输入,其中的伽玛校正已移除。如果您位于线性空间中,则会以隐性方式将此转换应用到颜色。使用硬件 sRGB 读取进行纹理采样,依次向伽玛空间和图形硬件的样本上提供 源纹理,然后自动转换结果。然后向着色器提供 这些输入,照明会照常运行。然后,程序会将所得的值写入到帧缓冲区。此值将进行伽玛校正并写入到帧缓冲区,或留在线性空间中以备将来进行伽玛校正;这取决于当前的渲染配置。

线性照明与伽玛照明之间的区别

使用线性照明时,照明方程式的输入值不同于伽玛空间中的值。这表示,光线到达表面时形成的感应曲线不同于现有 Unity 渲染管道形成的感应曲线。

灯光衰减

远距离和普通基于照明的衰减有两种变化方式。首先,在线性模式中渲染时,执行的额外伽玛校正将扩大灯光半径。其次,这也将导致照明边缘更加锐化。这可更准确地模仿表面的照明亮度衰减。

线性亮度感应

使用伽玛空间照明时,向着色器提供 的颜色和纹理含有其中应用的伽玛校正。将其用于着色器时,高亮度的颜色实际上比线性照明的亮度更大。这表示,随着光线亮度增加,表面会以非线性方式变亮。这将导致许多位置的光线过亮,还会使得模型和场景呈褪色状。使用线性照明时,随着照明亮度的增加,但表面的感应仍呈线性。这可令表面的着色更具真实感,并极大地美化表面的色感应效果。

3.0Lee Perry-Smith 的 Infinite 三维头部扫描 (Head Scan) 获得了 Creative Commons Attribution 3.0 Unported License 许可。资料来源:http://www.ir-ltd.net/infinite-3d-head-scan-released

线性空间与伽玛空间混合

在帧缓冲区执行混合时,色彩空间或帧缓冲区中也会进行混合。使用伽玛渲染则表示,非线性颜色混合在一起。这种说法不正确。使用线性空间渲染时,线性空间中会进行混合,这种说法是正确的,并且会生成预期的结果。

使用线性照明

线性照明可改变已渲染场景的外观。如果您制作一个线性照明工程,更改伽玛照明后,其外观很可能会改变。因此,如果从伽玛照明切换至线性照明,可能需要花一段时间更新工程,使其外观和切换之前一样美观。一般说来,在 Unity 中启用线性照明非常简单。您需要在每个工程中启用此功能,并在播放器设置 (Player Settings) 中依次选择编辑 (Edit) -> 工程设置 (Project Settings) -> 播放器 (Player) -> 其他设置 (Other Settings) 进行设置

光照贴图

使用线性照明时,所有照明和纹理都呈线性,这表示传递至光照贴图的值也需要修改。在线性照明和伽玛照明之间切换或返回时,需要重新烘焙光照贴图。Unity 光照贴图界面将在光照贴图位于错误的色彩空间时发出警告。

支持的平台

并非所有平台都支持线性渲染。目前支持此功能的目标发布平台有:

尽管这些目标平台支持线性照明,但不能保证设备上的图形硬件可以正确渲染场景。您可通过查看 QualitySettings.desiredColorSpaceQualitySettings.activeColorSpace 检查所需的色彩空间和目前支持的色彩空间,如果所需的色彩空间为线性,但可用的色彩空间为伽玛,则播放器会退回至伽玛空间。这可用于显示警告框,告知用户应用程序无法正确显示,或强制退出播放器。

线性和非 HDR

不使用 HDR 时,则使用支持 sRGB 读取和 sRGB 写入(灰度 (Degamma) 用于读取,伽玛 (Gamma) 用于写入)的特殊类型的帧缓冲区。这表示,帧缓冲区的值如纹理一样进行了伽玛校正。将此帧缓冲区用于混合纹理或绑定为纹理时,程序会先使用伽玛,再用值移除伽玛。将这些缓冲区写入至正在写入的值时,其将从线性空间切换至伽玛空间。如果在线性模式中进行渲染,则所有后期处理效果会启用 sRGB 读取和写入功能来创建其源缓冲区和目标缓冲区,并在线性空间中进行后期处理和后期处理混合。

线性和 HDR

使用 HDR 时,渲染会在浮点缓冲区进行。这些缓冲区的分辨率足够高,无论何时访问缓冲区,都无需在伽玛空间之间来回转换,这表示在线性模式中渲染时,使用的目标渲染将把颜色存储于线性空间中。这意味着,将在线性空间中以隐性方式执行所有混合和后期处理效果。后台缓冲区写入时,将应用伽玛校正。

GUI 和线性制作的纹理

渲染 Unity GUI 时,我们不会在线性空间中执行渲染。这表示,GUI 纹理不应在读取时移除其伽玛。这可通过两种方法实现。

查询纹理和将其 RGB 值撰写为具有特定含义的其他纹理应采用带通 sRGB 采样,这一点也很重要。

这将强制样本纹理不会在图形硬件使用伽玛之前将其移除。这也可用于其他类型的纹理,例如希望传递至着色器的值与已制作纹理中的值完全相同的遮蔽图。

Page last updated: 2013-06-26