皆さんご存知のOpenEXRですが,ちょっとしたきっかけでソースを読みました. OpenEXR 興味深いのは,OpenEXRでは画像を16-bit floatとして扱っている部分です.え?16-bit integerじゃないの?32-bit CPUでどうやって計算すんの?そもそも16-bit floatってどんなビット並び? ドキュメントによると,OpenEXRでの16-bit floatは,符号に1ビット,指数部に5ビット,仮数部に10ビットとなっています.もちろんこんな型は現在の一般的な32-bit CPUでは規定されていません. では,OpenEXRはどうしているのかというと,これこそがOpenEXRの「キモ」なのですが,C++のクラスとして”half”という型を定義し,演算子をオーバーロードする事で演算を可能にしています.演算その物は32-bit floatに変換してから行われるのですが,この変換は前もって作られたテーブルをルックアップする事で高速に処理できるようになっています. なるほど,16-bitという事は,表現できるビット並びは僅か65536個です.これくらいなら全部をテーブルにしておいても全く問題ありません.素晴らしいアイディアです. また,同じようなテクニックが,画像全体に演算が必要な場合にも用いられています.与えられた関数で65536回(全てのビットパターン)の演算を先に行い,テーブルを作っておくことによって実際の画像に適応する時はテーブルルックアップで済ませるわけです.65536というのは256×256ですから,これよりも大きなデータを処理する場合は確実に速くなり,大抵はRGBかRGBAチャンネルを持つ画像ですから,更に効率が良くなります. これ,下手すると32-bit floatな画像を普通に処理するよりも速いんじゃないですかねえ. さて,こんなに高度なトリックを駆使したOpenEXRですが,なぜもっとシンプルに32-bit floatを使わないのでしょうか?ILMは社内で使うHDRI画像フォーマットに,32-bit floatではなく16-bit floatを採用しました.その理由として,OpenEXRのサイトで次のように書いています. 32-bit floating-point TIFF is often overkill for visual effects work. 32-bit FP TIFF provides more than sufficient precision and dynamic range for VFX images, but it comes at the cost of storage, both on disk and [...]