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

自动曝光会慢慢的改变,有一个调整的过程(像真实的相机一样)。大的值意味着调整速度快。