ガンマについてです。
フォトリアル3DCGの分野ではおそらく多くの人を悩ます
「最も重要な基礎」ではないでしょうか。
2DCGの分野でもガンマの問題はありますが、その議論はあくまでも「絵を見る環境」に終始し
コンピュータに描画させる3DCGとは本質的なポイントが異なります。
2DCGでは描く人が描きたい色を選択し描きたいように描いて見せたいように見せるため
「どの環境でも自分が描いたときの環境と同じように見せる」という点でガンマに悩みます。
そのため、「ディスプレイやOS・アプリケーションによってガンマが異なる」という面を中心に議論することになります。
3DCGではそれに加えて、また別のガンマに関する問題があるのです。
3DCGでは色の選択だけ人がして、レンダリングはコンピュータが行います。
実はそのレンダリングをする際にレンダラーに渡される実際の「色」にガンマがかかっているのです。
ここではできるだけ順序立てて論理立てて、これらの3DCGにおけるガンマのことを
分かりやすく説明していこうと思いますが、分かりやすい説明になっているかとても不安です。
また、補足説明として青字を入れていきますが、混乱するので最初は飛ばして読んでください。
2回目以降であっても数学と思考遊びが好きで原理も知りたいという人以外は読まないほうがいいと思います。
参考:
djx blog 実はガンマまわりについて書いてあるサイトは非常に多く、それらを踏まえると際限なく考察ができると思うのですが
ここでは3DCG制作において必要な箇所のみをかいつまんで書いていこうと思います。
1.
「ガンマ」とは「嫌な特性」のことここから先の文章で出てくる「ガンマ」という言葉はすべて
「嫌な特性」と置き換えてもらってもかまいません。
また、一切ガンマのかかっていない状態(つまり一切「嫌な特性」の無い正常なデータ)のことを
「リニア」といい、
「ガンマ」の対義語が「リニア」だと思ってください。
例えば、ガンマのかかっていないデータなら「リニアデータ」だし
ガンマを排除するためのCG制作フローは「リニアワークフロー」となります。
※もっと中身を理解したい人へ
ガンマのかかったデータというのは
(出力)=(入力)^γ
となるデータのことです。
ここでいう「入力」「出力」は場合によっていろいろなものが当てはまりますが、
多くは「入力」はユーザがキーボードやらマウスで指定した入力で
「出力」はディスプレイに表示された結果のことです。
対してリニアデータというのは
(出力)=(入力)
となっているデータのことで、数式で言えばy=xという一次関数のグラフになるため「リニア」というのです。2.
ディスプレイは「色メガネ」「市販のディスプレイは色メガネ」だと思ってください。
今あなたが見ているパソコンのディスプレイも例外なく「色メガネ」です。
例えば、
この色はディスプレイ越しだと
この色だと思いますが、
それはディスプレイという「色メガネ」を通した結果「
この色」となっただけで
コンピュータ内部では実は「
この色」ではありません。
コンピュータ内部で認識されている本来の色は、
この色より明るい、
こんな色になっています。
このような、実際の色より暗めに表示してしまうディスプレイの「嫌な特性」のことを
「ディスプレイガンマ」といいます。
そしてもちろん、あなたが3DCGソフト上のカラーピッカーで選択した色や
ネットでひろってきたテクスチャも、このディスプレイガンマのせいで
全て例外なく「本来のその色」ではありません。このように
ディスプレイガンマの弊害により生まれた、
「本来のデータではないけどディスプレイを通すとそれっぽく見えるデータ」
のもつ「嫌な特性」を
「ファイルガンマ」といいます。
ネット上に公開されている写真や絵、テクスチャやCG作品はほぼ全てが
この「ファイルガンマ」を持つデータと考えていいと思います。
(※ただしHDRデータは無補正データであり、ガンマは持っていません)
※もっと中身を理解したい人へ
ガンマ問題のタチが悪いのは、「ディスプレイに騙されていることに気付かない」ことです。
ユーザは「ディスプレイ上のカラーピッカー」で色を選び、「ディスプレイ上で色を確認する」しかないため
普通に作業している分には全く意識しない、というか意識できません。
そのためガンマの知識が無いのにも関わらず一生懸命フォトリアルなCGを作ろうとするユーザは
理不尽な苦労を強いられることになります。私のように。
ガンマの問題は氷山の一角で、このような「知らなかったらできない」「言われないと意識できない」ことは
まだまだたくさんあるのではないでしょうか。
※※さらに中身を理解したい人へ
なぜディスプレイにはガンマがかかっているのでしょうか。
普通にディスプレイを開発すれば、リニアなディスプレイができそうだと思いませんか?
実際にこのガンマの問題も、ガンマが1.0のディスプレイを使用してCG制作をすれば一気に解決します。(※※※)
普通に考えれば「入力信号」=「出力信号」となるディスプレイを作るほうがよっぽど楽で、
どちらかというとむしろガンマをかけるほうが手間なのではないでしょうか。
ディスプレイにガンマがかかっているその原因は、我々「人間の目のガンマ」にあります。
実は人間の目にもガンマがかかっています。
さらっと言いましたが、これはものすごいことなんですよ。
さきほど「ディスプレイに騙されてることすら気付かない」と言いましたが、同じことが我々の目にも言えるということです。
自分の目にも騙されて、ディスプレイにも騙されていればマイナスのマイナスで元に戻る?いやプラスのプラスで倍になる?
それ以前に人間が中心となる世の中で、今見てる色が実は違う色なんてことになれば「本当の色」って何?
「本当の色」がわかったとして、どうやって証明するの?唯一の観測者である人間はどうやってそれを認識するの?
というか「人間の目にもガンマがかかっている」という事実を突き止めた人はどうやって突き止めたの?
と、一種の自己同一性に関わる哲学にも似た議論になります。
我々は生まれてから死ぬまで一生外せない「色メガネ」をかけているのです。
民族間の偏見や差別が永遠になくならない理由も分かりますよね。
という方向に持っていけば宗教や倫理の話になります。
しかし、実際は自己同一性がどうとかそんな大仰な話ではありません。
本題の「ディスプレイにガンマがかかっている理由」ですが、
結論からいえば「人間の感覚に合わせて色階調を効率的に表示できるから」です。
実は「人間の目にガンマがかかっている」というのは大仰な言い方で、このガンマは感覚的にすぐ分かるちょっとした特性です。
例えば、100個の黒い石の中に白い石がひとつだけ混ざっていれば、その石はすごく目立ちますよね。
しかし、100個の黒い石と101個の白い石が混ざっていたときに、「白のほうが多くて目立つ」と思う人はまずいないはずです。
白い石一個増えたことには変わりないのに、ふたつの感じ方の差は歴然です。
そしてもし石の色が赤・青・緑だったらどうでしょう。
もし石ではなくディスプレイの素子だったらどうでしょう。
人間の目がリニアでないことが実感できてきたかと思います。
私がはじめてこれを実感したときは、言葉通り目から鱗がはがれ落ちた気分になりました。
実はMayaのマニュアルにもこのことは書いてあり、
人間の目は光を非直線的(ノン リニア)に知覚するため、実際には人間の目は前者のカラーを後者のカラーの 2 倍の明るさとして知覚します。
という表記があります。
しかしこのように人間の色の感じ方にはガンマがかかっているのに、
RGB256階調をそのままリニアにディスプレイ出力していれば、せっかくの256階調が台無しです。
そこでディスプレイのメーカーは考えたのだと思います。
人間の色の感じ方が鈍い箇所の階調は間引いて、感じ方が鋭い箇所に多くの階調を費やすにはどうすればよいか。
そして結論としてディスプレイにも人間の目のようなガンマをかければ色を効率よく表示できる
ということになったのだと思います。
発想としては素晴らしいと思いますが、そのせいで後々CG制作に携わる人々が苦労することになるなんて
微塵も思わなかったことでしょう。
※※※ガンマが1.0のディスプレイを使用したらどうなるか
実はこれはこれで現時点では問題があります。
まず他のディスプレイのガンマは1.0ではないのですから、最後にガンマをかけなくてはいけません。
そして、そのガンマが1.0のディスプレイで見るときだけは逆ガンマをかけ直す必要があります。
これらの手間がひとつめの問題点です。
ふたつめとしてソフトのUIに問題が出てきます。
レンダリング結果はリニアで気持ちの良いものになりますが、実際に操作するUIはディスプレイガンマのことを踏まえて
作られているので、ガンマを1.0に調節したディスプレイで作業するときは見づらく作業しづらいと思います。
全てのディスプレイやプリンタのガンマが1.0になり、全てのソフトのUIが1.0に合わせて調節される
といったガンマ革命が起これば話は別ですが。
3.
ガンマとレンダラディスプレイやファイルにはガンマがかかっているわけですが、レンダラはそんなことお構いなしです。
正しいデータを受け取っていると想定して正しくレンダリングの計算を開始し、正しいレンダリング結果を出力します。
そしてそれはディスプレイを介して人間の目に届くのです。
上の文章中で問題点がふたつあります。
ひとつめは「正しいデータを受け取っていると想定して」の部分。
全てのテクスチャや色はファイルガンマをもっているため、当然正しいデータではありません。
ふたつめは「ディスプレイを介して」の部分。
せっかくレンダラが正しい計算をしてくれているのに、ガンマをもったディスプレイを介されると
「正しくない出力」になってしまうため物理レンダラの意味がありません。
4.
2回の「ガンマ補正」以上の話を踏まえると、CG制作中にガンマを逆数にして補正し
ガンマを相殺しなければいけないことが分かると思います。
この「ガンマを逆数にして相殺すること」を「ガンマ補正」と言います。
ガンマ補正するタイミングは
2回。
ファイルガンマの補正とディスプレイガンマの補正です。
レンダリング前に全てのテクスチャや色パラメータを補正し、
レンダリング後にディスプレイガンマを相殺するガンマ補正を行います。
ここで大事なことは、ファイルガンマというのはディスプレイガンマの弊害によって生まれたものであり
ディスプレイガンマの裏返しなので、両者はお互い逆ガンマをもっているということです。
ディスプレイガンマは想定した色を暗くしますが、ファイルガンマは想定した色を明るくします。
それは、「『想定した色を暗くするディスプレイガンマ環境下』で作られたデータ」が持つガンマがファイルガンマだからです。
ややこしくなってきましたが、じっくりと反芻して理解するのがよいと思います。
つまり、同じガンマ補正なのに補正の仕方がまるっきり逆になるのです。
具体的なガンマの数値やMayaでのガンマ補正の仕方は次の記事で説明しようと思います。
※もっと理解したい人へ
2回ガンマ補正したとして、結局何がどう変わるのでしょうか。
全てのテクスチャ・色を暗くしてレンダリング結果を明るくする。
なんだかプラスマイナスゼロのような気がしますよね。
しかし実際に比べてみると差は歴然です。

上側はガンマ補正が1.0(つまり補正しないということです)
下側はガンマ補正が2.2でかけてあります。
ガンマ補正をかけてあるというのは具体的には
「ファイルガンマ補正・ディスプレイガンマ補正のどちらもディスプレイガンマ値2.2を想定して行っている」
ということです。
上の画を比べてなんとなく違いを把握するのがよいと思いますが、
言葉にするなら「物体の陰」や「光の減衰」が『正しく』なるのだと思います。
どちらが正しいのかはデッサン力がある人でもなかなか分からないと思いますが、
物理的・論理的に正しいのはガンマ補正をしたほうの画ということになっています。
もちろん、人はごくまれに論理や理論を超えますので、
上の画のほうが正しいと思う人はガンマ補正しなくてもいいと思います。
ただ、人が論理や理論を超越するのは「ごくまれに」だということを覚えておくと後悔しないと思います。