Unity编辑器提供线性工作流和伽玛工作流。线性工作流具有颜色空间交叉点,其中纹理在渲染GameObject、Sprite或UI元素时使用的图像。纹理通常应用于网格的表面以提供视觉细节。更多信息
见词汇表在伽玛颜色空间中创建的可以正确且精确地在线性颜色空间中渲染。有关伽玛和线性颜色空间更多信息,请参阅线性渲染概述。
有关更多信息,请参阅
纹理通常存储在伽玛颜色空间中,而着色器期望线性颜色空间。因此,当在着色器中采样纹理时,基于伽玛的值会导致不准确的结果。为了克服这一问题,您可以设置Unity使用RGB采样器从伽玛采样转换到线性采样。这确保了所有着色器的输入输出都在正确的颜色空间中,从而得到正确的结果。
要指定伽玛或线性工作流,请转到编辑 > 项目设置一组广泛的设置,可让您配置项目如何处理物理、音频、网络、图形、输入以及其他方面。更多信息
见词汇表,然后选择播放器类别,导航到其他设置,打开渲染部分,并根据您的喜好将颜色空间更改为线性或伽玛。
虽然线性工作流可以确保更精确的渲染,但有时您可能希望使用伽玛工作流(例如,在某些平台上,硬件仅支持伽玛格式)。
为此,在播放器设置中将颜色空间设置为伽玛(菜单:编辑 > 项目设置,然后选择播放器类别)。Unity使用伽玛颜色空间进行颜色计算,并保持导入的纹理处于伽玛颜色空间。此外,Unity确保着色器保持纹理在伽玛颜色空间中,并在伽玛颜色空间中进行计算,并将写入不由伽玛校正重新应用的帧缓冲区。
纹理导入设置可能会显示纹理为线性格式,因为这可以避免着色器将纹理识别为伽玛颜色空间并自动删除伽玛校正。
请注意,您可以通过取消选中Texture的检查器窗口中的sRGB (颜色纹理)复选框来绕过“颜色空间:伽玛”模式中的sRGB采样。
在线性颜色空间中工作比在伽玛颜色空间中工作可以提供更准确的渲染。
要完成此操作,请将播放器设置中的色彩空间设置为线性(菜单:编辑 > 项目设置,然后选择播放器类别)。
如果您创建的纹理是在线性或伽玛色彩空间中创建的,您可以在线性色彩空间中工作。伽玛色彩空间的纹理输入到线性色彩空间着色器程序中时,已从它们中去除伽玛校正。
注意:即使在您正在线性色彩空间中工作的情况下,纹理导入设置中的纹理预览窗口也会使用伽玛混合来显示纹理。
对于颜色,这种转换是隐式应用的,因为 Unity 编辑器已经在将值作为常量传递到 GPU 之前将它们转换为浮点数。在采样纹理时,GPU 自动去除伽玛校正,将结果转换为线性空间。
然后将这些输入传递到着色器中,光照计算在正常情况下按线性空间进行。当将结果值写入帧缓冲区时,它将立即进行伽玛校正或保留在线性空间中以进行后续伽玛校正 - 这取决于当前的渲染配置。例如,在宽动态范围(HDR)中,渲染结果将保留在线性空间,并稍后进行伽玛校正。
在使用线性渲染时,光照方程中的输入值与伽玛空间中的值不同。这意味着根据色彩空间会有不同的结果。例如,光线击中表面的响应曲线不同,图像效果的表现也不同。
基于距离和法线的光照衰减以两种方式不同
在以线性模式渲染时,执行的额外伽玛校正使得光的半径看起来更大。
光照边缘也更为清晰。这更正确地模拟了光照强度在表面上的衰减。
当您使用伽玛渲染时,提供给着色器的颜色和纹理已经应用了伽玛校正。当它们在着色器中使用时,高亮度颜色实际上比线性光照亮度更高。这意味着随着光强度的增加,表面以非线性的方式变亮。这可能导致许多地方的照明过亮。它还可以给模型和场景一个场景包含您的游戏的环境和菜单。将每个唯一的场景文件视为一个独特的关卡。在场景中,您放置环境、障碍物和装饰元素,本质上是在设计并构建您的游戏。 更多信息
在术语表中查看带来一种褪色的感觉。当您使用线性渲染时,随着光强度的增加,表面的响应保持线性。这导致表面阴影和表面颜色响应更加真实。
下方的无限三维头部扫描图展示了在直射照明和伽马照明下,人脑模型上不同光强度的效果。
当混合到帧缓冲区时,混合发生在帧缓冲区的颜色空间中。
当您使用伽马空间渲染时,非线性颜色会混合在一起。这不是正确混合颜色的数学方法,可能会产生意外结果,但这是某些图形硬件上执行的唯一混合方式。
当您使用线性空间渲染时,混合发生在线性颜色空间:这是数学上正确的,并且产生精确的结果。
下方的图像展示了不同类型的混合