【理论学院】HDR技术详解:理论篇

20 十二月, 2014
183
3

引言:

HDRi的全称是high dynamic range image,意思是高动态范围图片。最近的这些年已经非常的火热了。使用一张HDR图片或者再另外补一两盏灯光作为场景的照明,已经是越来越普及的做法。而很多对这种图片以及这种照明方案了解不深的朋友心里可能总有个疑惑——在以前的CG行业里,照明是一件非常复杂的事情,一个场景经常要打几十甚至上百盏灯光才能得到好效果。怎么到了现在只需要一张图片就解决照明问题了?世界上有这么轻巧的事情啊?

世界上就有这么轻巧的事情。CG行业是一个发展非常迅速的行业,往往你上个月还在用的软件,这个月就出了新版本;你上个月还在使用的工作流程,这个月已经有了更快的解决方案。在这样一个日新月异的行业里,照明的解决方案,也当然飞速地发展了。以前要手动打很多盏灯光来照明的主要原因是机器性能不行,跑GI(全局照明)太慢,所以要手动打补光,人为处理出全局照明的感觉。然而时代进步了,机器速度已经几何级增长了,现在大家都用得起GI了,理论上完全不需要再依赖手动打补光了。你可以选择在场景中设置跟真实世界接近的光源,或者你还有这样的选择:使用一种HDRi贴图来照亮你的场景。

因为大部分朋友早就将HDR照明应用到自己的工作流程中去了,所以,这篇文章的内容对于大部分朋友来说都会很熟悉。如果你已经知道怎么去运用,而对这背后的原理和逻辑有一定兴趣的话,可以看看理论部分。而这次的教程更倾向于对HDR并不太了解的新手朋友,相信你们看完这次的教程,会对HDR的概念原理有一定的认知,并且知道该怎么使用HDR对自己的场景进行照明。

虽然本教程使用三维软件为maya,渲染器是mental rayvray。但是讲述的原理是完全可以互通的,你只要理解透了这些概念,方法拿到哪里都是一样适用的。

全文分理论部分,CG领域中的应用部分,和噪点问题的解决方案三大块儿。

其中理论部分梳理了完备的理论体系,全部消化吸收能够让你对整个CG技术的认知有所提高,说起来适合所有人阅读,但是如果你对理论头大也可以先跳过或暂时跳过理论部分直接从实战部分开始看起。

CG领域中的应用部分则着重介绍在CG领域里怎么运用HDR技术,以及HDR技术给我们带来的好处到底体现在哪里,适合新手,或者知其然不知其所以然的朋友。这一部分观看视频会吸收得更好。

如果你已经是个高手了,那么可以直接跳过前面两个部分,到达这次教程在实战意义上真正精华的最后一部分——噪点问题的解决方案,你将了解解决采用HDR照明时GI通道和reflection通道噪点问题的完美方案。

理论部分:

HDRi是一种类型的图片的统称,同时也是一种图片格式。所谓HDR就是高动态范围图片,和它对应的一个概念是LDRilow dynamic range image),低动态范围图片。而我们日常使用的大部分图片,几乎都是LDR,不管是我们的jpgpngtga还是tiff,都是低动态范围。而我们现在用的最多的HDR图片格式主要有两种:openEXRHDR

那么这个动态范围又是什么,怎么划分的呢?

1)位深度的概念

这本来是一个摄影的概念,说起来复杂,相信看这文章的都是搞CG的,我就从CG的角度简单地说些有用的。在我们的认知领域里,你可以把动态范围简单地理解为一个图片所能涵盖的信息量。涵盖的信息量越多,那么动态范围越大,反之亦反。

这里就要说一个“位深度”的概念了。我们都知道,电脑是二进制的,只有01,而你可以把位想象成一个开关,当这个位等于1的时候,开关打开;当这个位等于0的时候,开关关闭。所以,每一个位,有两种可能。

而如果我有两个位,或者说两个开关呢?它们放在一起会有多少种组合?答案是4种,分别为:00,01,10,11

那么,如果有三个位,或者说三个开关,又有几种可能?答案是8种,分别为:000,001,010,011,100,101,110,111

那么,如果是四个位呢?答案是16种。聪明的朋友应该已经发现规律了:有多少位,就有2的多少次方种可能。这其实是高中的排列组合知识,我给大家义务复习了一下。

看到这里有人会说了,我是做美术的,你跟我说这些乱七八糟的数学知识搞毛呢?其实你不要急躁,了解这些知识,才能让你完全吃透,并且驾驭你所使用的流程与工具。很快我就要讲到,这些数学和计算机知识跟我们的CG是怎么联系的。

可能有的朋友一直有听说过,我们的图片也有位数。比如说,我们的jpg图片就是8位的。而很多人只是知道,却并不真正了解这到底意味着什么。根据我们前面说的知识,8位即意味着28次方种可能,即为256种可能。相信很多朋友看到这个数字心里会一激灵,因为有点ps基础的朋友都知道,我们的图片放进ps里是有256个色阶的。这二者是不是有什么联系?你猜的不错。

我们说的8位的jpg图片,真正的说法应该是:每个像素每个通道使用8个二进制位储存信息的图片。

对于储存颜色信息,我打一些比方,如果你只有一个位去储存信息,那么你就只有开或者关两种可能,如果你用开表示纯白色,关表示纯黑色,那么你就的世界就只有黑与白;如果你使用两个位去记录信息,那么你就有四种可能,你就可以在纯黑和纯白之间再加入两个过度的灰色。

那么,你要是使用8个位共产生256种可能,亦即是256个色阶,从黑到白有一个均匀的灰度过度。

你一定要弄明白,到这里为止,就算你有8个位,256个色阶,你也暂时只能制造出灰色的过度色阶。而如果你想要彩色的照片的话,你还要让这些灰度的色阶产生颜色,想要表达大自然绚丽的色彩,我们是使用三种纯纯的颜色,分别发出不同的亮度,复合在一起而产生出来的。这三种颜色就是我们顶顶大名的RGB红绿蓝了。

我大概描述下这个过程。比如说红通道,只能发红光,而红光的强度,根据你的色阶来定:色阶为0,则是纯黑的红色,色阶为128,半亮的红色,色阶为255,则为纯纯的最亮的红色(0-255一共256个色阶)。同时绿通道和蓝通道也是一样,发出某种强度的光,最后把他们复合在一起,就产生我们所见的颜色。

也就是说,我们彩色的jpg图片,每个像素点都有三个通道,每个通道都有8位,于是每个像素就需要24位来记录色彩信息。到这里,我们可以做一个简单的小实验来验证我们前面探讨的知识点。在计算机中,1位即是1Bit8个位占一个字节,即是1byte。而我们平时说的1kb则为1024byte1Mb 1024kb。那么根据我们刚才的说法,每个像素都占24位的空间,即是3byte的空间,那么我们创建一个1024*1024的图片,就有1024*1024*3byte=3MB的大小了。我们可以在ps里创建这么大一张图然后看看ps算出来的大小。果然论证了我们的说法。

【理论学院05】HDR技术详解_理论篇

在你储存TGA图片格式的时候,你会发现,ps会为你,到底要储存多少位的图片。我们主要关心的是24位和32位两种。根据之前说的知识,你大概可以猜到,24位的图片,意思是,24/像素,即3个通道每像素;而32位怎么来的呢?32 4*8;也就是说,4个通道每像素?是的。那这多出来的通道是啥?其实就是我们平时说的alpha通道了。如果你做了一个带alpha通道的TGA图片,储存的时候选的是24位,你会发现最后你的alpha通道不见了。看到这里你应该明白原因了。

2LDRiHDRi直观感受

说了这么多,大家应该已经开始熟悉位深度相关的概念了。回到我们最开始的概念上。所谓低动态范围图片LDR,一般是指数值以整型(integer)类型来储存的图片;而HDR,则是指数值以浮点(float)类型来储存的图片。整型和浮点是编程里的术语,用人的语言来说,就是整数和小数。比如说,我们传统的jpg图片,色阶只能是整数0255,不能是小数,你没见过哪个色阶是1.52.8什么的吧。但是我们的HDR图片,因为自身独特的编码方式,却可以用小数来表达色阶;更重要的是,HDR的图片,储存的色阶信息可以超出屏幕亮度范围之外,亮的地方可以比纯白还亮,黑的地方可以比纯黑还黑。

而这些超出显示范围之外的数据,甚至不能被直接观察到!那么我们要这些数据有什么用呢?HDR图片主要会被摄影和CG两个领域所使用,主要利用的点也正是它本身的动态范围够大。我们传统拍照的时候,你如果直接去拍天空,那么太阳以及其附近的范围,因为亮度太亮,所以会得到没有细节的纯白的一片,就是我们俗话说的曝掉了。但是如果你使用HDR的手法去拍摄天空太阳,虽然直观的效果也是纯白的一片,但是在后期软件中,我们可以通过调整曝光,让隐藏在纯白色一片里面的亮度信息逐步显现出来。如前文所说,HDR图片可以储存范围极广的信息,有很多信息在你的屏幕上不能直接观察到,你只能通过调整曝光来观察。

虽然你不能直接观察藏起来的信息,但是这些信息是一直存在图片中的,你不知道电脑知道。它们可以正确读取图片上特别亮和特别暗的区域的信息,在我们的CG领域里,我们就可以使用这些信息对场景进行照明。

这一部分参考视频教学会得到最直观的感受。

3*HDR格式与openEXR格式分别是如何储存信息

那么HDR贴图为什么可以储存这么大量的信息呢?这是跟我们HDR贴图储存信息的方式有关的。我们这里主要讲讲最常用的HDR格式和exr格式。

HDR格式是使用RGBE四个8位通道,一共32位通道来储存信息。前面的RGB大家都知道是干嘛的了,那最后的E呢?这个通道指的是exponent,曝光通道,你可以把前面的RGB理解成某个像素的颜色,而这个E通道,可以理解成这个像素的亮度。他们的计算公式也很简单,如下图:

【理论学院05】HDR技术详解_理论篇

因为E8位,所以取值范围也是0255;当E128时,20次方为1RGB值保持初始。当E大于128时,没大个1RGB的亮度就会比之前亮一倍,指数上升。比如说,我们使用(100,100,130,150)的参数,得到的正真RGB值其实是:

【理论学院05】HDR技术详解_理论篇

你想象一下,在我们的电脑上,255就已经是纯白的了,这三个数字所代表的亮度是有多大!

而如果E小于128,则相当于是用原先的RGB值除以2的倍数,会得到一些小数,就是我们之前说的浮点数,这样就会在暗部得到很多8位图片不具备的中间过渡信息。同样,假如我们使用115作为我们的exponent,即E通道的值,那么结果就是:

【理论学院05】HDR技术详解_理论篇

可以想见,这是多么逼近于纯黑的颜色,人眼根本无法察觉。而这些信息,就都老老实实地储存在我们的HDR图片中。

所以,HDR格式的图片,是以RGBE 48位通道,一共32位信息储存的。现在我要讲一讲我们CG行业里更流行的另外一种图片格式openEXR(以下简称exr),这个在早些年被工业光魔发明并且逐渐变成行业标杆的格式。

Exr格式的储存方式是使用4*16Bit RGBA来储存数据的,即是说,它使用四个通道分别为红绿蓝和alpha,每个通道占16位储存空间,每个像素占48位储存空间来储存数据。而这16位信息exr图片是这样分配的,拿出一位来表示这个数值的正负;拿出10位来储存RGBA的基本信息;拿出5位来表示曝光度。跟之前HDR图片的记录方式有些类似。

只不过,我们基本的RGBA值的精度更高,有210次方,1024个色阶;而能表达的亮度范围却比较小一些,只有25次方,32个档。

所以这两种图片格式的区别就很明确了。openEXR图片的精度要高于HDR图片(RGBA1024色阶);而HDR图片的亮度范围要高于openEXR图片;但是最关键的点在这里,HDR图片不能带alpha非常不方便合成,所以摄影里用的相对多一些;而openEXR格式除了能带alpha通道以外,还可以人工置入一些我们三维软件里渲染出来的别的通道,非常适合CG工作者。

附一张各种HDR格式的对比。

【理论学院05】HDR技术详解_理论篇

图片摘自 the HDRi handbook 2.0

4*16位整型与16位浮点图片的区别

这里要跟大家梳理一个比较容易混淆的概念。就是16/通道/像素的图片,即有可能是HDR的也有可能是LDR的。比如说,你在ps里打开一些jpg图片,然后你可以在模式里,将图片的位深度从8/通道/像素改成16/通道/像素,但是这并不意味着图片就被改成openEXR类型,图片并没有因此由LDR变成HDR

这是因为同样是16/通道/像素,也是有两种储存方式的。像工业光魔的储存方式我们刚才介绍过了,是一种浮点的储存方式,结果是HDR的。但是ps默认改成16/通道/像素,却是整型的储存方式,即是说,把黑到白的信息,分配到216次方,65536个色阶里去了。0表示黑色,65535表示白色,而其间的一些数值表示过度的灰阶。只是说,相对于8位的256个色阶,我们储存的信息量确实大了很多,色阶和色阶之间的过度也微妙了很多。但是我们的储存方式依然是用整数的方式,并且,我们的最大亮度也不能超过纯白。所以,使用16/通道/像素的整型方式储存数据的图片,完全不具有HDR的效果。(16/通道/像素整型储存的图片,主要作用于tone mapping过程中,浮点数据塌陷为整型数据之后如果有调色的步骤,可以使用16/通道/像素的整型格式作为缓冲格式,进行调色之类的工作,完了之后再把16/通道/像素的信息塌陷成8/通道/像素的一般图片,方便在网上发布和在pc上浏览;如果要打印,可能保留16/通道/像素的信息以及将色彩空间设置在adobeRGB会得到更理想的效果。这是关于tone mapping的知识,不是本篇教程所讨论的主要内容)

而在mental rayframe buffer中,你是可以设定你的输出类型的。

【理论学院05】HDR技术详解_理论篇

你会发现你有两种RGBA 4*16Bit,就是说你有两种16/通道/像素的图片储存方式。其中half类型就是工业光魔开发的方式,即是HDR的类型;而short,则是我们刚才说的整点储存类型,实则是LDR类型。

所以对于你渲染输出的图来说,如果你想获得HDR图片的收益,就要使用RGBAHalf4*16Bit

5)HDR图片的生成

HDR的图片,主要有两种生产方式。一种是我们熟悉的三维软件渲染,另一种就是用相机拍摄。而用相机拍摄的时候呢,并不像一般拍照那样,卡擦一下就拍好了。而是要对着同样的构图,卡擦卡擦拍好多张,而每张的曝光度要有所差别,最后用软件将这些曝光度有差异的图片合成成一张,就得到了我们的HDR了。

所以说,其实一张HDR图片,就相当于我们正常的n张曝光图片的合成,就涵盖了很观光的亮度范围。有一句话概括得非常好:HDR图片相当于一个将当时的光照信息完全记录下来的打包文件。

所以说,我们每次使用HDR贴图去照明的时候,就相当于把我们的三维场景放置在当时拍摄的环境里去照明一样。所以,有很多时候,仅仅使用一张HDR贴图作为你场景的光源就已经足够了。

视频教程中,我使用自己拍摄的三张照片做了一个简单的例子。因为硬件的限制,只拍了三张,HDR的作用没完全体现出来,但也足够大家体会了。

【理论学院05】HDR技术详解_理论篇

【理论学院05】HDR技术详解_理论篇

【理论学院05】HDR技术详解_理论篇