高动态范围
高动态范围(HDR)是一项技术,这项技术可以产生图像,并且所产生图像的亮度的动态范围比使用标准动态范围(SDR)来得更广,它强调对颜色和光泽的真实绘制。
HDR的工作原理
通常在渲染过程中,像素的红绿蓝三个通道的值均是使用0到1之间的8位值进行存储,对于显示设备而言,0表示没有强度,1表示最大强度。这个限制了 颜色值的范围,并不能准确地反映现实生活中人们感知灯光的方式,以及在非常亮或者非常暗的情况下会导致不真实的图像的产生。
在HDR渲染过程中,像素值是浮点型。这意味着像素值可以有更大的选择范围,这样就可以更准确地表示人眼感知颜色和光泽的方式。
Unity中的HDR
在unity中,你可以使用HDR图像进行内部渲染计算,我们称这种方式为HDR渲染。当开启HDR渲染,unity会先将场景渲染进HDR图像缓冲区,然后再执行渲染操作,比如进行后处理,使用HDR图像等。言外之意就是说,在这些计算的执行过程中使用了可以产生极其逼真效果的数值。
在某些兼容的平台上,unity可以发送HDR图像到显示设备上。我们把这点称之为HDR输出
使用HDR的优点
- 在高亮度的情况下颜色不会丢失
- 可以获得更好的微光效果
- 减少低频照明域上的环带现象
使用HDR的缺点
- 增加了显存的使用率
- 额外的对于显示在屏幕上的颜色基调重映射的计算
- 与硬件消除锯齿的方式不兼容
渲染管线的兼容性
渲染管线 | HDR 渲染 | HDR 输出 |
---|---|---|
内置渲染管线 | 支持 在每个camera的Inspector面板中, 或者 Camera.allowHDRAPI激活HDR渲染。 在Graphic settings窗口中为各个层激活HRD渲染和配置HDR缓冲区格式。 | 支持,不过仅限于某些控制平台 想要了解详情可以参考具体平台的文档 |
通用渲染管线(URP) | 支持 在每个camera的Inspector面板中, 或者 Camera.allowHDRAPI激活HDR渲染。 使用通用渲染管线资源激活所有相机的HDR渲染。 | 研究中 开发团队还在研究实现这个功能的方式,目前还没有发布时间的计划 |
高清晰渲染管线(HDRP) | 支持 HDR渲染默认对所有摄像机开启,你无法关闭 | 研究中 开发团队还在研究实现这个功能的方式,目前还没有发布时间的计划 |
颜色基调重映射
颜色基调重映射是将颜色值从一个范围到另一个范围重映射的过程,只要你使用HDR,就必然会用这个重映射在HDR图像缓存区中转换颜色,以便颜色值保持在显示设备可以处理的范围之内。如果不用颜色基调重映射,那么图像就会丢失很多细节和颜色信息,特别是在曝光的区域
一个使用HDR渲染并且使用SDR输出的场景,没有使用颜色基调重映射,大部分像素看起来超出了范围
和上边同样的场景,但是这次,基调重映射把大多数强烈的部分降到了一个看似合理的范围。注意,自适应的颜色基调重映射甚至可以融合上边两幅图,以此来模拟自适应的视觉媒体(比如,眼睛和摄像机)
在使用HDR进行渲染以及SDR进行输出时,就必须使用颜色基调重映射将HDR图像数据转换为SDR图像进行显示。unity提供了颜色基调重映射后处理插件帮助你做到这一点:Post-Processing Stack V2 package, URP integrated post-processing solution, 和 HDRP integrated post-processing solution 所有包含颜色基调重映射的特效都在这里了。
想要了解更多的在支持的控制台平台上使用HDR渲染和HDR输出的资讯,可以参考具体平台的文档说明
在内置渲染管线中使用HDR
在前向渲染路径中,只有摄像机上有post-processing特效,摄像机才能支持HDR,这是处于对性能的考虑。如果摄像机上没有post-processing特效,场景会直接被渲染到后台缓冲区,这个后台缓冲区并不支持HDR
在延迟着色渲染路径下,当摄像机开启HDR时,浮点型的光照缓存区也会随即被分配。这样减少了灯光缓冲区中的条带