tutorial_hdr - seraph526/godot-se GitHub Wiki
高动态范围 (High Dynamic Range)
介绍
通常,艺术家制作所有的3D模型,然后是所有的贴图,在3D DCC中查看他/她的令人惊叹的模型,说"看起来很不错,可以使用了!",然后导入到游戏中,设置灯光,游戏运行。
那么,HDR是从哪来的?这是用来代替处理颜色的,值从黑到白(0到1),我们使用比还白的颜色(如,0到8倍的白)
更实际些,想像一下,在一个普通的场景中,光的强度(通常为1.0)设置为5.0,整个场景会变得非常亮(相对白色而言),看起来有点恐怖。
之后,场景的亮度是通过所的有像素的平无均值计算的,这个值用来使场景回到普通的亮度范围。最后的操作是tone-mapping.最后,我得到和起始差不多的场景:
除非场景需要更高的对比度,因为在游戏中高光范围。这个有哪些有用的用途呢?用途是当你在世界场景中移动时,场景的亮度会改变,允许像下面这样的情况:
特别的,可以设置一个阀值传递给发光缓冲区,它取决于像素的亮度。这可以获得更加真实的灯光渗色效果。
线性颜色空间 (Linear Color Space)
这个技术的问题是显示器使用了gamma曲线来调整使之更符合人眼和习惯。艺术家也在屏幕上创造他们的作品,所以他们的作品会受到隐含的gamma曲线的影响。 显示器上的图片的颜色空间叫作"sRGB".每个可视化的内容,在电脑上的,或者从网上下载的(如图片,视频,色情照片等)都属于这个空间。
线性颜色空间 & 资产管线 (Linear Color Space & Asset Pipeline)
工作于HDR模式不只是点下开关这么简单。首先,导入图片资产必须在导入时转化为线性空间。有两种方式:
SRGB->Linear图片导入时转化 (SRGB->Linear conversion on image import)
这是使用线性资产兼容性最好的方式,它在任何平台都会正常工作,包括mobile设置。最大的问题是质量的丢失,因为sRGB的出现也是为了避免同样的问题。使用8bits通道表示线性颜色从人眼的角度看是没有效率的。这些纹理随后会被压缩,问题会更明显。 但,在任何情况下,这都是最简单的解决方法.
硬件sRGB->Linear转化 (Hardware sRGB -> Linear conversion)
这是最正确的使用线性空间的方式,因为基于GPU的纹理采样在使用浮点读取纹理后会做转化。这种方式在PC和consoles上都正常工作,但许多mobile设备都不支持,或者不支持压缩的纹理格式(如ios)
最后转化Linear -> sRGB (Linear -> sRGB at the end)
在所有的渲染完毕后,线性空间渲染的图片会被转化回sRGB模式。要做到这点,只要在当前的环境Environment中简单开启sRGB转化即可(下面会详细讲述)
记住 sRGB -> Linear和Linear -> sRGB转化两个都要同时开启.如果没有开启其中的一项会导致可怕的视觉效果,这种效果只适合于实验性的前卫独立游戏。
HDR参数 (Parameters of HDR)
在Environment资源中可以找到HDR选项。这些大部分时候可以在WorldEnvironment节点或camera设置中找到。HDR有许多参数:
ToneMapper
ToneMapper是核心的算法。它提供了很多选项:
- Linear:最简单的tonemapper.它的主要工作是调节场景亮度,但如果亮度差异太大,它会导致颜色过饱和。
- Log:和linear类似,但没有那么极端。
- Reinhardt:传统的tonemapper(调节此项不会太降低饱和度)
- ReinhardtAutoWhite:和上面的一样,但是使用场景的最大亮度来调节白色值。
Exposure
和真实相机一样的曝光参数。控制进度相机的光量。大的数值会使场景更亮,低的数值会导致暗的场景。
White
白色的最大值。
Glow Threshold
决定超过哪个值(0到1,场景被色调调节之后),灯光开始渗色。
Glow Scale
决定灯光渗色多少.
Min Luminance
场景灯光的最小值,此时tonemapper停止工作。这使得黑暗的场景一直保持黑暗。
Max Luminance
场景灯光的最大值,此时tonemapper停止工作,这使得明亮的场景一直处于饱和状态。
Exposure Adjustment Speed
自动曝光会慢慢的改变,有一个调整的过程(像真实的相机一样)。大的值意味着调整速度快。