- 用户指南
- 资源商店 (Asset Store)
- 资源服务器 (Asset Server)(仅限团队许可证)
- 缓存服务器(仅限团队许可证)
- 幕后场景
- 创建游戏
- 运行时实例化预设 (Prefabs)
- 变换 (Transforms)
- 物理
- 添加随机的游戏元素
- 粒子系统(Particle Systems)
- Mecanim 动画系统
- 旧动画系统
- 导航网格 (Navmesh) 和寻路 (Pathfinding)(仅限专业版 (Pro))
- Sound (音频侦听器)
- 游戏界面元素
- 多玩家联网游戏
- iOS 开发入门
- Android 开发入门
- Blackberry 10 开发入门
- Metro:入门指南
- 本地客户端开发入门
- FAQ
- Advanced
- Vector Cookbook
- 资源包(仅限专业版)
- Graphics Features
- 资源数据库 (AssetDatabase)
- 构建播放器管道
- 分析器(仅限专业版)
- 光照贴图快速入门
- 遮挡剔除(仅限专业版)
- 相机使用技巧
- 运行时加载资源
- 通过脚本修改源资源
- 用程序生成网格几何体
- 富文本
- 在 Unity 工程 (Project) 中使用 Mono DLL
- 事件函数的执行顺序
- 移动优化实用指南
- Unity XCode 工程结构
- 优化图形性能
- 减少文件大小
- 理解自动内存管理
- 平台依赖编译
- 泛型函数
- 调试
- 插件(专业版/移动版特有功能)
- 文本场景文件格式(仅限专业版)
- 流媒体资源
- 启动时运行编辑器脚本代码
- 网络模拟
- VisualStudio C 集成
- 分析
- 检查更新
- 安装多版本 Unity
- 故障排除
- Unity 中的阴影
- Unity 中的 IME
- 对集成显卡进行优化
- 网络播放器 (Web Player) 部署
- 使用网络播放器中的信任链系统
线性照明(仅限专业版)
概述
线性照明指在所有输入呈线性的情况下照亮场景的过程。通常,存在将伽玛预先应用到其中的纹理,这表示,纹理在材质中进行采样时,呈非线性。如果这些纹理用于标准照明方程式,将导致方程式结果不正确,因为预计所有输入在使用前都呈线性。
线性照明指确保着色器的输入和输出都使用正确的色彩空间的过程,它可提高照明的准确性。
现有(伽玛)管道
在现有渲染管道中,所有颜色和纹理都在伽玛空间中采样,也就是说,在着色器使用图像或颜色之前,伽玛校正不会从其中移除。由于这一原因,着色器中的输入位于伽玛空间,但在照明方程式使用这些输入时,均视其位于线性空间中,最终未将伽玛校正应用到最终像素。大部分时候,上述现象看似合理,因为两种错误从某种程度相互抵消。但这是不正确的。
线性照明管道
如果启用线性照明,则会提供 着色器工程的输入,其中的伽玛校正已移除。如果您位于线性空间中,则会以隐性方式将此转换应用到颜色。使用硬件 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 光照贴图界面将在光照贴图位于错误的色彩空间时发出警告。
支持的平台
并非所有平台都支持线性渲染。目前支持此功能的目标发布平台有:
- Windows & Mac(编辑器、standalone、网页播放器)
- Xbox 360
- PlayStation 3
尽管这些目标平台支持线性照明,但不能保证设备上的图形硬件可以正确渲染场景。您可通过查看 QualitySettings.desiredColorSpace 和 QualitySettings.activeColorSpace 检查所需的色彩空间和目前支持的色彩空间,如果所需的色彩空间为线性,但可用的色彩空间为伽玛,则播放器会退回至伽玛空间。这可用于显示警告框,告知用户应用程序无法正确显示,或强制退出播放器。
线性和非 HDR
不使用 HDR 时,则使用支持 sRGB 读取和 sRGB 写入(灰度 (Degamma) 用于读取,伽玛 (Gamma) 用于写入)的特殊类型的帧缓冲区。这表示,帧缓冲区的值如纹理一样进行了伽玛校正。将此帧缓冲区用于混合纹理或绑定为纹理时,程序会先使用伽玛,再用值移除伽玛。将这些缓冲区写入至正在写入的值时,其将从线性空间切换至伽玛空间。如果在线性模式中进行渲染,则所有后期处理效果会启用 sRGB 读取和写入功能来创建其源缓冲区和目标缓冲区,并在线性空间中进行后期处理和后期处理混合。
线性和 HDR
使用 HDR 时,渲染会在浮点缓冲区进行。这些缓冲区的分辨率足够高,无论何时访问缓冲区,都无需在伽玛空间之间来回转换,这表示在线性模式中渲染时,使用的目标渲染将把颜色存储于线性空间中。这意味着,将在线性空间中以隐性方式执行所有混合和后期处理效果。后台缓冲区写入时,将应用伽玛校正。
GUI 和线性制作的纹理
渲染 Unity GUI 时,我们不会在线性空间中执行渲染。这表示,GUI 纹理不应在读取时移除其伽玛。这可通过两种方法实现。
- 在纹理导入程序中将纹理类型设为 GUI
- 在高级纹理导入程序中勾选“带通 sRGB 采样 (Bypass sRGB Sampling)”
查询纹理和将其 RGB 值撰写为具有特定含义的其他纹理应采用带通 sRGB 采样,这一点也很重要。
这将强制样本纹理不会在图形硬件使用伽玛之前将其移除。这也可用于其他类型的纹理,例如希望传递至着色器的值与已制作纹理中的值完全相同的遮蔽图。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论