在像 Pixar 这样的 animation studio,或是像 ILM 这样大规模的 VFX studio 里头,OpenEXR 扮演了一个很是重要的角色:工做过程当中,能够用来预览或是再加工(合成)的图片文件。咱们就如同其它的 studio 同样,也是使用 EXR 做为内部的图档使用。公司里头,绝大部分的 exr 文件,都是 renderer 的产物。OpenEXR 是个能够用来乘载 HDR 的图片格式,在 ILM 的推波助澜,加上其它 studio 的跟进以及动画软件的支持下,几乎成了某种 de facto 标准。而后,它终究只是一个“够开放“的图档格式,如何有效且正确的善用它,才是更重要的事。node
如下几点,是咱们在太极影音的工做过程当中,发展出来的一些经验:安全
- EXR 档案里头没有任何标头或 tag 指出它存的 color space 是线性(linear)、gamma 2.2(1.8, 2.6, ...)等,而是由使用的人或是软件自行解释。
- EXR 鼓励以 linear color space 的方式来存内容 (scene-referred)。这样无论是人、机器或是软件,都不用去猜想别的可能性,并且对于后期合成来讲,既不用对拿到的影像想太多就直接操做,也不须要先作个转换,是比较省事且安全有效率的 pipeline。但这点不是强制性的,只能说是你们约定成俗的一种习惯性用法。就像咱们如今都认为相机出来的 JPEG 通常是 sRGB (~ gamma2.2) 或 Adobe RGB,但其实 JPEG spec 并无定义这个。
- EXR 以 linear 储存后,在显示时才去根据不一样的 display device,使用不一样的 transformation 或是 LUT 来转换。要求比较严苛的工做环境,会就每一个 display device 有一组 LUT (1D? 2D? 3D? 这部分我尚未做完研究各类 LUT 表示法的适用情况,只能说,理论上 3D LUT 比较厉害。),且会定时根据 device 的情况来更新那组 LUT。这种做法是很是很是严苛的要求下的做法。
- EXR 能够有任意的 metadata,因此是能够在里头存个 'colorspace' 的 meta 来用,不过这样得确认全部接触到此 exr 的程序,都有去“尊重“这个 meta 才有用,否则反而会落得不伦不类的。
- EXR 储存的数值,只有 16-bit 或是 32-bit 的这两种,并无 8-bit, 10-bit, 12-bit, 24-bit, ... 等此说法。当有人这样说时,能够假设是只用了比较少的 bit(ex, 16 bits 中,只用了 14 bits,另外两个 bits 为零),但存在档案里时,同样是 16 或是 32 bits。
- 一样的图片,以 linear 与 log 的方式来存的话(这边指的是单纯的 log,并不是 REDlog 或是 panalog 这类特定的 preset),log 存的档案的确是会小一点点,约节省了 10%~20%。但它仍旧是以 16 bits 或是 32 bits 来存。
- 压缩方法中,有 loseless 与 lossy 两种。PIZ, ZIP, ZIP (16 scanline), RLE 属于 loseless。其中 ZIP (16 scanline) 对于 CG image 的压缩率最大;而 PIZ 对于有 film grain 的 image 有最好的表现(由于使用了 wavelet)。B44 或是 B44A 为 lossy,咱们现有的工做环境不会使用到,也不该该使用到才是。
- 像素(pixel) 存的方式,又分为 scanline 与 tiled。后者适合以一张 .exr 来存一整个 mipmaps,就像 .tex 同样(.tex 是 .tif 的一种小变型)。prman(Pixar's RenderMan)的 texture 这个 shader op,也许已经有支持 .tiff 或 .exr 了(我没去确认),但我相信对于 .tex 的支持应该仍旧是最好的。
further reading:less
- ILM 于 SIGGRAPH 2004 发表的 OpenEXR Color Management 是个很好的参考,不过其中的 CTL 已经开始由 OpenColorIO 取代掉了。
- Understanding Nuke's unique Layer and Channel system (including the Shuffle Nodes).