在像 Pixar 這樣的 animation studio,或是像 ILM 這樣大規模的 VFX studio 裏頭,OpenEXR 扮演了一個非常重要的角色:工作過程中,可以用來預覽或是再製的圖片檔。我們就如同其它的 studio 一樣,也是使用 EXR 作為內部的圖檔使用。公司裏頭,絕大部分的 exr 檔,都是 renderer 的產物。OpenEXR 是個可以用來乘載 HDR 的圖檔格式,在 ILM 的推波助瀾,加上其它 studio 的跟進,動畫軟體的支援下,幾乎成了某種 de facto 標票。然後,它終究只是一個“夠開放“的圖檔格式,如何有效且正確的善用它,才是更重要的事。
以下幾點,是我們在太極影音的工作過程中,發展出來的一些經驗:
- 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:
- ILM 於 SIGGRAPH 2004 發表的 OpenEXR Color Management 是個很好的參考,不過其中的 CTL 已經開始由 OpenColorIO 取代掉了。
- Understanding Nuke’s unique Layer and Channel system (including the Shuffle Nodes).