图形处理中的HDR与ToneMapping

在计算机图形渲染的后处理流程中,有时候会经常遇见所谓的ToneMap,所谓的色调映射。要解释色调映射要从HDR开始说起。因为ToneMap其实就是HDR的一个步骤。

HDR即High Dynamic Range。它通过多张照片合成一张大范围动态亮度的图片。无论是数码相机还是胶片相机都存在曝光的概念。其实HDR的D--dynamic指的即是曝光时间的不一样的动态效果。同样的环境,在同一个位置给景色拍照,在不同的曝光时间下得到的图片是不一样的。曝光时间越长,对该景色的阴影部分的细节记录越有利,对明亮的地方则越不利(明亮的地方就全白色了)。相反,曝光时间越长,对阴影部分越不利(阴影部分全黑),却对明亮部分越有利。HDR的第一步是结合这些不同曝光时间的下的图片数据合成一张明亮度范围更广的数据。假设每一张图片的某个像素点的某个RGB中的一个值只能从0取到255,那么,对三张图片合成之后,其值应该能取到更大的范围,例如从0取到1024。例如,一个点在低曝光时间下的值为200,那么在正常曝光下,该点取的值肯定要大于200。所以HDR这里的H和R,所谓的High Range就是这么来的。多张照片得到了更大范围的像素值。

那么问题来了,得到了这么大范围的值后,如何显示?要知道打印机,显示器通常能够显示某种颜色的范围只有0到255。HDR的合成的数值的范围有时候能高达0到100000. 这时候,就需要用到色调映射ToneMap了。把大范围的色调,映射到小范围的数值上。映射方法有很多种,最简单的线性映射,即是按照比例,对每个值做缩小(这也是一些图形引擎的默认方法)。但是这种方法对于追求美化的目的来做图形处理是不够的。映射的方法需要充分考虑人类眼睛对颜色的敏感度,人类对美感的感觉来调整。有时候我们更想看清阴暗的细节,有时候我们更想看清全面性的细节,这些都是说不准的。

最后,提一下threejs的ToneMap。threejs的WebGLRenderer是可以定义ToneMap的方法和各种参数,来模拟HDR的处理过程的。因为有时候人们也确实存在对3D场景图像的不同需求。如果再配合上一些后处理算法,例如boom,高通过滤等,我们就可控制ToneMap的一些参数。例如通过控制ToneMapExprosure就可以控制某些物体是否高亮,和一些特殊的效果。