2014/04/20

【Maya】出力画像のビット深度指定について


知っている人は知っている…なんですが、
ビット深度を指定する箇所で「Half」とか「Short」とか並んでいる
あれは一体なに?というところでもにょったので調べてみましたメモ。




まずは冒頭の画像ですが…
Mayaのレンダー設定ウィンドウにて、レンダラーをMentalrayにしたときの、
Framebufferセクション > Data Typeプルダウンメニューのスクリーンショットです。

たとえばRGBの仲間たちを見てみましょう。

  • RGB(Byte) 3x8Bit
  • RGB(Short) 3x16Bit
  • RGB(Half) 3x16Bit
  • RGB(Float) 3x32Bit

なにも考えずにざっとこのリストを眺めて、以下のように思いました。

Floatは浮動小数点で32bitの深さで記録するやつ、一番ダイナミックレンジが出せる。
 てことは、Halfは浮動小数点じゃなくて、なにかが半分…?
 Shortは…bitの深さはHalfと一緒だけど一体なにが短いんです…?
 Byteに至っては…8bitを1Byteって換算するのは知っておりますが…一体」

という次第で、ざっくり言うと混乱しました。あはは。

◆調べてみました。


調べて分かったのですが、この表記はなんのことはない、
(プログラミング的な)「データ型」の呼称に沿ったものだったのですね。
偉大なるmel様から足を踏み込んだ身としては、
数値の型は「整数(int)」/「小数(float)」というのがある、
くらいまでは分かっていたのですが、
所詮そこまででした。
> 「整数と浮動小数点数

さらに踏み込むと、数値の型はさらに以下のように分けられるそうです

・整数
 byte, short, int, long
・浮動小数点数
 half, float, double

まず整数の方ですが、
左から順に1バイト、2バイト、4バイト、8バイトのデータを一つの単位とするデータ型。
既に書いたように1バイトは8bitをまとめた単位です。
short以降については日本語で「短精度整数型」「整数型」「長精度整数型」と呼ぶようです。
http://ja.wikipedia.org/wiki/整数型
※ここでは冒頭のプルダウンに一番近そうなJavaのデータ型を参考にしました。

また浮動小数点数の方は、左からそれぞれ 16bit, 32bit, 64bit 単位のデータ型で、
同じく日本語的には「半精度浮動小数点数」「単精度浮動小数点数」「倍精度浮動小数点数
http://ja.wikipedia.org/wiki/浮動小数点数
なるほどhalfとかdoubleとかをそのまま訳してこういう風になっている訳ですね。

と、ここまで調べたところで最初のビット深度のリストに戻ります

  • RGB(Byte) 3x8Bit
  • RGB(Short) 3x16Bit
  • RGB(Half) 3x16Bit
  • RGB(Float) 3x32Bit


↑これ。
上記で仕込んだ情報をもとに眺めると、こういう(▼)意味だったんですね!

  • RGB(Byte) 3x8Bit =RGB3チャンネル、8bitの整数で記録
  • RGB(Short) 3x16Bit =RGB3チャンネル、16bitの整数で記録
  • RGB(Half) 3x16Bit =RGB3チャンネル、16bitの浮動小数点数で記録
  • RGB(Float) 3x32Bit =RGB3チャンネル、32bitの浮動小数点数で記録

「整数はint!小数はfloat!」で入門した手前混乱した訳ですが、
floatは(32bitの)小数、intは(32bitの)整数、
という意味を裏で持っていたことになります。
halfとshortは、同じ16bitでも全然別のデータ型ですよーっていう意図で
別の単語を割り当てたんでしょうが、
並べると分かりにくいわい(笑)

せめてMaya側/Mentalray側では、多少はそれを噛み砕いて表記してくれてもよかったんじゃないでしょうか(^^;
レンダリング設定する側的には、浮動小数点かどうかと、ビット深度を指定できればいいので
たとえばこんなかんじで…

  • RGB 3x8bit(integer)
  • RGB 3x16bit(integer)
  • RGB 3x16bit(floating point)
  • RGB 3x32bit(floating point)

…紛らわしくなければなんでもよいです!(∀;;)


【蛇足1】
なぜ「32bitが基準」な感じになっているのかについて、
『32bitを1ワードとする「32bitアーキテクチャ」を基にして』用語化されたことに由来するようです。
ということは、現在多くの(PC、スマートフォンなどの一般的な)コンピュータは64bitアーキテクチャですが、
仮に今のタイミングで用語化されていたら、shortは32bit整数、halfは32bit小数を指す言葉になったということなんでしょうね。

【蛇足2】
浮動小数点数型の各ビットにはそれぞれ意味があって、その割り当て方には標準規格として「IEEE754方式」というのがあるようです。
CG方面でお世話になっている「OpenEXR」はILMが開発したハイダイナミックレンジ画像フォーマットとして普及していますが、
「32bitなんて高コストすぎるし、16bitで必要充分ではなかろうか?」
と言ったかどうかは知りませんが、それがもとになって16bit FP (a.k.a half)は後にIEEE754-2008に含まれて標準規格化された、という流れがある模様。
(※ OpenEXRのaboutページによると「32-bit floating-point TIFF is often overkill for visual effects work.(VFX的には32bit素材とかしばしば(殺戮的に)行き過ぎ感ある)」とのこと)
というわけで、IEEE754の中に half が規定されているのはOpenEXRの影響というか、映像・画像処理のために生まれたデータ型というか!(?)
ほー
(でも、マシンのパフォーマンスが向上しまくれば
 いずれ32bitも高コストでなくなり、そのうち64bitも普通になり…
 ってなるんでしょうかね。)

【蛇足3】
冒頭のプルダウンをみていて気づいたんですが、
RGB、RGBAのほかに「RGBE」ってのが居るんですがなんですか(ノД`)
え、RGB Extended? .hdrのためのフォーマット??
すいません知りませんでした…(゚A゚;)
(でもビット深度は 4x8bitて…??)



【蛇足4】
20140812追記。
Houdiniの例(→)。
こういうのでいいんだよ、こういうので。
むしろこういうのいいです。

続けてC4D R14の例(→)。
32bitしか選択できない模様。

オプションとして圧縮形式を指定できるメニューがあって、そこだと16bitフロートとか24bitフロートとかあるんですが、多分それはチャンネルのビット深度とはまた違う話題ですよね。

最新版だとまた違うのかな。
R16がこないだ発表されてました。



◆参考

プリミティブ型 @ JAVA習得への道
http://javaget.jugem.jp/?eid=11

半精度浮動小数点の使用によるパフォーマンスの向上 | iSUS
http://www.isus.jp/article/performance-special/half-precision-floats/

こんなまとめもあったのですね
画像フォーマットのbit数による違い、int, floatの違いなどまとめ
http://togetter.com/li/10556

Mentalray - フレームバッファ @ Maya ユーザーガイド
http://download.autodesk.com/global/docs/maya2014/ja_jp/files/GUID-67B3D408-76A5-43FA-BC4B-1E1F2243C1F6.htm#TOC_ENTRY__d30e820786


0 件のコメント:

コメントを投稿