After Effectsのリニアカラースペース(ガンマ)での合成について。旧ブログで書いたことを改めて書きなおしてみます。After EffectsのバージョンもCS5で前提です。
まず32bpcのお話
これは旧ブログで書いたことと同じですが、AfterEffectsにおける32bpc合成のお話です。AfterEffectsには8/16/32bpcという色深度が存在しています。8/16bitはそれぞれInteger(整数)で、8bitよりも16bitの方がより多くの階調を再現できるという認識で間違っていません。32bitも同じように階調表現が増加するのですが、それと同時に32bitはfloat(浮動小数)であるという点が大きく違います。floatでは0.0-1.0で各チャンネルを表示します(通常の8bit整数では0-255)。更にHDRに対応した画像では0以下あるいは1以上のデータもClampされずに保存されているので、画像に処理を加えたときにこれらのデータを使用して階調を保持することができます。検索すればもっと上手く説明してくれているサイトもあるかと思いますが、大雑把に言ってしまうと非常に広域の色を保持できるということです。
以下が参考画像です。AfterEffectsの「Ramp(カラーカーブ)」エフェクトを使い4レイヤーをAddモードで合成した画像です。ともに32bpcモードで作業して16bit(Int)のTIFFと16bit(float)のOpenEXRで出力したものです(OpenEXRなどのfloatデータは16/32bitがありますが、AfterEffectsではfloatで合成する場合には32bitしかありません)
これらを再度AfterEffectsの32bpcモードのプロジェクトに読みこんで露出を変更してみます。
下の図の上段が読み込んだ直後の状態。16bitでも32bitでもこの状態ではほとんど見分けは付きません。
露出をアンダーにしてみます。白くなっていた部分でもOpenEXR(16bit float)では階調が維持されているのがわかります。対してTIFF(16bit Int)では白く飛んでいた部分がそのまま跡を残してアンダーに落ちています。
このように広色域のfloat型のデータがリニア合成では使用されます。もちろん8/16bit整数でもガンマをリニアにして合成することは可能ですが、flaot型のリニアカラースペースのデータのように最大/最小明度を超えた見えていない部分の階調までを保持するのは不可能です。
逆にいうと単にバンディングなどのトラブルを避けたいのであれば16bit Intでも充分なので、32bpcで作業を行う場合には「HDRで作業を行う」という明確な意図がないと長所を活かすことができません。
ガンマ値
次にガンマ値について。After Effectsでは「作業スペース」と言ってますが、映像制作においては使用されるガンマ値の違いを指し、大きくわけて「Video」, 「Log」, 「Linear」となります。「作業スペース」だと訳がわからなくなるので、ここではNukeなどで使われるカラースペース(Color Space)と表記します。いわゆる色表示系のカラースペース(RGB, HLS, CMYK)ではありません。ガンマ値は映像機器の入力を正しく補正するための値であり、入力ガンマと出力ガンマを掛け合わせたときに理論上「1.0」となるように設計されています。映像機器が出力機器の特性に合わせて逆ガンマを掛け合わせて(ガンマエンコードされて)作成されているということです。CRT時代のウンチクとかもあるんでしょうが、デバイスガンマに関してはこの際無視しておきます。
コンポジット作業を行う上意識しないといけないのは「入力」「作業」「表示」「出力」というそれぞれのカラースペースです。「入力」はインポートするフッテージのカラースペースです。「作業」は作業中のカラースペースでAfter Effectsでいえばプロジェクトのカラースペースです。「表示」は作業中モニターに表示される時のカラースペース。そして「出力」はファイルなどへの書き出しのカラースペースです。これらは密接に関係していますが、個別に設定が可能であり32bpcで作業を行う上では注意が必要です。
ガンマの違いですが、まずAfter EffectsではおなじみのVideo系です。乱暴にVideoと言ってしまいましたが、これにはsRGBなどの印刷を主体とした入出力を管理するCMS(Colour Management System)や、Rec.709やAdobe RGB、ICC-PCSフォーマットなどのCMSもこの分類に含まれています。一般にビデオやPCの表示で用いられるガンマ2.2を大雑把にVideoとここでは便宜上呼んでしまいます。PCで作成されたデータやビデオからキャプチャされたものはガンマ2.2の機器で正しく表示されると予測されます。もしPCやビデオがsRGBに準拠していれば、そのデータはガンマ2.2で正しく表示されます。余談ですが、前述の3つのフォーマットで明確に「ガンマエンコードされている」と言えるのは、このVideoのみです。このあたりの話は第2回以降の記事で機会があればちょっと説明してみようと思います。
次にLog系ですが、これはCineonやDPXなどで用いられているもので、ネガフィルムの特性をデータにしたものです。ネガフィルムの特性上、暗部での階調表現を重視し、それに加えて明部での階調を維持しています。ネガフィルムでは露出に迷ったときはオーバー気味に撮れと言われていますが、それは明部はネガに銀が残るために、プリント時に露光時間を多くすることで再現が可能だからです。暗部は銀が荒い落とされるので復元が難しくなります。
フィルムは暗部から中間調までの情報に多くの情報を持ち、明部でもプリント時の露光に応じてディテールを再現できるだけの情報を有しています。このネガフィルムの情報を可能な限り忠実に再現しようとKodakが開発したのがCineonフォーマットであり後に拡張されてDPXフォーマットとなりました。Logはそのままでは合成処理で非常に扱いにくく、扱いやすいLinearフォーマットに変換が必要になります。
時折勘違いされることがありますが、デジタルカメラのRAWフォーマットは、LogではなくLinearです。ただしAfter EffectsではAdobe Bridgeを経由して読み込むための、Bridgeの現象処理においてガンマエンコードされているということになります。
そして最後にこの記事の主題であるLinear(リニア)です。Linearはガンマ値でいうと1.0で、逆数をかけても変化しないという計算のしやすいフォーマットです。このOpenEXRなどのHDR対応フォーマットでは前述したように0.0以下あるいは1.0以上といったHDRを扱うことができ、HDRを扱うにはガンマが1.0でないと非常に不都合なのです。
下にあるグラフを見てもらうとわかりますが、ガンマエンコードされたデータでは、1.0を超えて大きくなればなるほどデータは指数的大きくなり、データを保存するためには非常に大きな値を用いないといけなくなります。Linearであれば値がいくら大きくなっても一次関数なので変化ありません。
HDR系フォーマットでは基本的にはLinearを用いています。というと、HDR対応フォーマットに記録された映像のガンマすべて1.0にデコードされていてガンマ2.2のモニターでは表示できないか?というとそういうことではありません。あくまで0.0を黒、1.0を白とした場合に、「黒(0.0)に0.5を足すと白(1.0)の半分の明るさになる」という直線上に記録されているという意味です。ちょっとうまく文章で説明できませんが...
HDR(ハイダナミックレンジ)を扱う上でLinearは非常に適しており、Linearを使うことで32bpcでの合成作業に意義が出てくるということです。前述しましたが、そうでなければ16bpcでも大して変わりません(特に書き出しがQuickTimeとかTGAであれば)。むしろ32bpcでは手間が増えると思います。
色々書き出すときりがないのでこの辺で。更に詳しく知りたいという人は下のリンク先などを読んでみてください。
Gamma FAQ - Frequently Asked Questions about Gamma - Charles Poynton
http://www.poynton.com/notes/colour_and_gamma/GammaFAQ.html
Raw Capture, Linear Gamma, and Exposure
[PDF]http://www.adobe.com/digitalimag/pdfs/linear_gamma.pdf
Autodesk Design Visualization
fieldjamのDesignVizエッセンス「第1回:リニアワークフローについて<その1>」
http://design-viz.com/blog/fieldjam/1_about_linearworkflow_1/
参考画像: Nukeのガンマカーブのグラフ
ほとんど具体的なこと書いてませんが長くなったので一度区切ります。読みにくい文章ばかりで図版少なめですみません。次回はもう少し具体的にAfter Effectsでのカラースペース(作業スペース)の設定について書いてみます。(続く...)
[関連記事]
AfterEffectsでのリニア合成のお話(2)
AfterEffectsでのリニア合成のお話(3)
DPX 10bitは重いのか?
ProEXR 1.6