关于 OpenEXR, 你应该要知道的几件事

在像 Pixar 这样的 animation studio,或是像 ILM 这样大规模的 VFX studio 里头,OpenEXR 扮演了一个非常重要的角色:工作过程中,可以用来预览或是再加工(合成)的图片文件。我们就如同其它的 studio 一样,也是使用 EXR 作为内部的图档使用。公司里头,绝大部分的 exr 文件,都是 renderer 的产物。OpenEXR 是个可以用来乘载 HDR 的图片格式,在 ILM 的推波助澜,加上其它 studio 的跟进以及动画软件的支持下,几乎成了某种 de facto 标准。然后,它终究只是一个“够开放“的图档格式,如何有效且正确的善用它,才是更重要的事。


以下几点,是我们在太极影音的工作过程中,发展出来的一些经验:


  1. EXR 档案里头没有任何标头或 tag 指出它存的 color space 是线性(linear)、gamma 2.2(1.8, 2.6, ...)等,而是由使用的人或是软件自行解释。
  2. EXR 鼓励以 linear color space 的方式来存内容 (scene-referred)。这样不管是人、机器或是软件,都不用去猜测别的可能性,而且对于后期合成来说,既不用对拿到的影像想太多就直接操作,也不需要先做个转换,是比较省事且安全有效率的 pipeline。但这点不是强制性的,只能说是大家约定成俗的一种习惯性用法。就像我们现在都认为相机出来的 JPEG 一般是 sRGB  (~ gamma2.2) 或 Adobe RGB,但其实 JPEG spec 并没有定义这个。
  3. EXR 以 linear 储存后,在显示时才去根据不同的 display device,使用不同的 transformation 或是 LUT 来转换。要求比较严苛的工作环境,会就每个 display device 有一组 LUT (1D? 2D? 3D? 这部分我还没有作完研究各种 LUT 表示法的适用状况,只能说,理论上 3D LUT 比较厉害。),且会定时根据 device 的状况来更新那组 LUT。这种作法是非常非常严苛的要求下的作法。
  4. EXR 可以有任意的 metadata,所以是可以在里头存个 'colorspace' 的 meta 来用,不过这样得确认所有接触到此 exr 的程序,都有去“尊重“这个 meta 才有用,不然反而会落得不三不四的。
  5. EXR 储存的数值,只有 16-bit 或是 32-bit 的这两种,并没有 8-bit, 10-bit, 12-bit, 24-bit, ... 等此说法。当有人这样说时,可以假设是只用了比较少的 bit(ex, 16 bits 中,只用了 14 bits,另外两个 bits 为零),但存在档案里时,一样是 16 或是 32 bits。
  6. 同样的图片,以 linear 与 log 的方式来存的话(这边指的是单纯的 log,并非 REDlog 或是 panalog 这类特定的 preset),log 存的档案的确是会小一点点,约节省了 10%~20%。但它仍旧是以 16 bits 或是 32 bits 来存。
  7. 压缩方法中,有 loseless 与 lossy 两种。PIZ, ZIP, ZIP (16 scanline), RLE 属于 loseless。其中 ZIP (16 scanline) 对于 CG image 的压缩率最大;而 PIZ 对于有 film grain 的 image 有最好的表现(因为使用了 wavelet)。B44 或是 B44A 为 lossy,我们现有的工作环境不会使用到,也不应该使用到才是。
  8. 像素(pixel) 存的方式,又分为 scanline 与 tiled。后者适合以一张 .exr 来存一整个 mipmaps,就像 .tex 一样(.tex 是 .tif 的一种小变型)。prman(Pixar's RenderMan)的 texture 这个 shader op,也许已经有支持 .tiff 或 .exr 了(我没去确认),但我相信对于 .tex 的支持应该仍旧是最好的。


further reading:


  1. ILM 于 SIGGRAPH 2004 发表的 OpenEXR Color Management 是个很好的参考,不过其中的 CTL 已经开始由 OpenColorIO 取代掉了。
  2. Understanding Nuke's unique Layer and Channel system (including the Shuffle Nodes).


你可能感兴趣的:(图形,OpenGL,C++C)