background

ガンマのはなし その6

2011年07月13日(Wed)

10. ランバートシェーディング

従来の「レンダリング結果はモニタガンマで暗く歪んでいる」という説明の根拠となったのは、レンダリング結果が自分の意図した結果(=普段私たちが目にする現実世界の様子)より暗い、というものだ。具体的に図示するとコレである。

110713-01

こんな複雑な形状を使うから話がややこしくなるんである。

確かに、このレンダリング結果は私たちがよく知っている現実とは異なるようである。しかしだからといって、モニタが悪さをしているのだ、いやレンダラの質が悪いのだ、などと結論づけるのは性急だ。明らかにレンダリング結果がおかしいと思うのなら、まず「なぜ通常のレンダラはそのような結果が出るように設計されているのか」と考えるべきだろう。

というわけでテスト形状。

110713-02

基本小道具の箱を使用。本当は平面で構わないんだけど、片面ポリゴンはカメラが裏に回ったときに見辛いんで箱にしておく。

拡散反射についておさらいしておこう。拡散反射とは、物質の表面の微細な凹凸によって、照射された光があらゆる方向に乱反射(つまり拡散)したものである。

110713-03

あらゆる方向に等しく反射しているので、どの方向から見ても同じように見える。つまり、拡散反射はカメラ位置の影響を受けない。

110713-04

これに対し、照射された光が一定方向に反射するものが鏡面反射である。一定の方向に反射しているので、カメラの位置が変化すると鏡面反射の位置や明るさは変化する。

110713-05

現実の物質には拡散反射や鏡面反射というパラメータはなく、ただ物質の反射率と表面の粗さ(凹凸)があるだけである。物質の分子構造によって入射光(のどの波長)がどれだけ吸収されるのかが決定し、表面の凹凸によって、入射光がまっすぐ反射するか乱反射するのか、その割合が決定する。CGにおける拡散反射や鏡面反射は、計算のために便宜的に分離して考えているだけなのだ。

さて、テスト形状の鏡面反射および他のあらゆるパラメータを0にして、拡散色を白に、拡散値を1にする。またライトを無限光1灯にし、色を白、強度を100%にしてテスト形状の真正面から照射する。このときのレンダリング結果から、ライトが当たっている面の色を拾って計測する。

110713-06

まあ予測通り白(輝度100%)になるわけだけども。次に、ライトの強度を変化させ、同様に色を計測する。

表1: ライト強度による表面の明るさの変化
ライト強度 [%]1009080706050403020100
表面輝度 [%]1009080706050403020100

このように、ライトの強度と表面の明るさは正比例の関係であることがわかる。(たぶんこの辺で結論がわかった人もいると思うけど、とりあえず最後までお付き合いいただきたい。)

ではライトの照射角度が変化した場合、物質表面の明るさ、すなわち拡散反射はどう変化するだろうか。これを計算するのが3DCGで最も基本的な陰影付け、ランバートシェーディングである。

ランバートシェーディングとはランベルトさん(ドイツ読み)が考えた「ランベルトの余弦則」に基づくシェーディング(陰影付け)手法である。その内容は「拡散反射は入射光の強度と拡散反射率、および入射光と物体表面の法線がなす角の余弦に比例する」というものだ。難しそうなので数式に翻訳してみよう。

Id=IL・Kd・cosθ

ここで、ILは入射光の強さ、Kdは拡散反射率、θは入射角(入射光と物体表面の法線のなす角度)である。式を眺めれば、拡散反射はライトが垂直に当たったときに最も強くなること(θ=0のときcosθ=1)、ライトの強さや拡散値に比例することなどが読み取れる。

では、なぜそうなるのかを考えてみよう。

ある一定の範囲に、垂直に光が当たったときのことを考えてみる。太いレーザー光か極端に絞ったスポットライトのように円筒状の光が当たったと考えてもいい。

110713-07

さてこのとき、ライトが斜めから当たったらどうなるだろうか。

円筒を斜めに切断すれば断面積は増える。ライトが斜めから当たれば、光の照射されている範囲が広くなるわけだ。ところが、ライトの強度が変化したわけではないので、照射されている光の量は変わらない。すると、どういうことが起こるだろう?

面積が増えた分、それまでの範囲に照射されている光の量が減るのである。

110713-08

光の当たる面積が倍になれば、照射されている光の量は半分になる。つまり

同範囲に照射される光量=垂直時の光量×(垂直時の面積/傾斜時の面積)

である。あとは三角比の問題だ。高校一年生の冬を思い出そう(中学校かもしれない)。

110713-09

入射角がθであるとき、面積は1/cosθ倍となり、単位面積あたりに照射される光の量はcosθ倍となる。照射される光の量がcosθ倍になるので、拡散反射もcosθ倍になるというわけだ。

このランバートシェーディングは3DCGにおいて最も基本となる陰影付けの方法である。おそらくほとんどのCGソフトがこの手法を用いているだろう(トゥーンなど特殊なシェーダを除く)。

では、実際にPoser上で確認してみよう。ここではライトを固定して、形状を回転させている。

110713-10

で、このときの色を計測してみる。

表2: 照射角度による表面輝度(拡散反射)の変化
θ [deg]030456090
cosθ 1.0000.8660.7070.5000.000
表面輝度 [%]1008771500

このことから、Poserの拡散反射もランベルトの余弦則に基づいていることがわかる。レンダリング結果のどこにも意図的な歪みはないし、手法は非常に明快に物理法則を単純化している。

気がついただろうか?

ここまでずっと、物理法則について話してきた。物質表面で拡散する光の量、物理的な光の量についての話をしてきたのだ。そう、その物理的な光が、人間の目にどのように映るかなどという話は一切出てきていないのである。

人間の知覚は変化を倍々で捉える法則がある。人間の知覚は明るく歪んでおり、ガンマ値だいたい0.5ぐらいのガンマ補正がかかっている。だけど、CGソフトはそんなものは考慮しない。ランベルトの余弦則に人間の知覚は登場しない。計算されるのはあくまで物理的な光の量である。

CGソフトが計算したレンダリング結果は、人間に見える世界を表現したものではない。あくまでそのピクセルからカメラに届く物理的な光の量をプロットしたものであって、言わばピクセルの輝度で図示した「光量分布図」なのだ。

なぜレンダリング結果が意図したより暗くなってしまうのか。モニタのガンマ特性によって画像が暗く歪められているからではなかった。最初からレンダリング結果そのものが、人間の感じる明るさを表現していなかったのだ。ならば、私たちの感覚に近づけるためにすべきことは何か。人間の知覚という、明るい歪みの補正をかけるのである。

人間の知覚はガンマ値にしてだいたい0.5ほどの歪みを持っている。だからまあ、モニタガンマの逆数、モニタガンマ2.2なら0.45の補正をかけてもあんまり大きな違いはない。なので従来の解説が微妙でも、結果はそれなりに伴っていたのだ。

しかしだからといって、「じゃあやっぱり今までの解説通りモニタの逆数で補正すればよかったんじゃないか」と早合点するのは危険そのものである。自分がさんざん「だいたい0.5ぐらい」と歯切れの悪い書き方をしてきたように、人間の知覚というのは一定の値ではないからだ。

人間の目の補正機能は複雑怪奇かつアバウトに高性能である。明るい場所でも暗い場所でも、しばらくすればそれなりに目が慣れる。日中の日陰のように極端に明るさが変化するところでも明部暗部それぞれきちんと知覚できる。一つの視界の中でさえ補正が働き、焦点・輝度はおろか画角まで奔放に変化するのだ。そんなシロモノを真似るのに、決して「じゃあ補正ガンマは0.45で」などと決め打ちできるわけがないのである。

つーか、補正を0.45でやったら多分普通に階調飛び起こしてると思う。やったらわかるけど。

(つづく……の前に付記)

レンダリング画像は物理的な光の量を図示したものだった。では写真のような見た目通りに表示されている画像はどうだろう。写真は物理的な光の量によってフィルムを感光させるものなので、現像時に恣意的に変化させられることはあるものの、実物の時点ではおおむね現実と同じ物理的な光の量を発している。ではなぜモニタ上でも同じように見えるのかというと、データ化されるときに補正がかけられているからである。スキャナで読み込むときやデジカメ内部でJpeg形式で保存されるとき、物理的に0.5ならデータは0.73にという具合に、明るい歪みによる補正をかけられているのだ。なので写真画像はモニタ上でリニアに表示されても、現実と同じように見えるのである。

だから前回はキッパリ否定したけど、このことを以てして「画像にはモニタガンマの逆数の補正がかかっている」と言ってしまっても、まあ間違いではないとは思う。正確にはスキャナで微調整した値だったり、デジカメでsRGBに変換したならsRGBのガンマ値を持っているわけだけど。さらに正確に言うなら、巷にあふれる写真画像で「恣意的な」ガンマ補正のかかってない画像なんてまずないわけで、今や安価なデジカメでさえ露出補正機能がついているわけで、一律にモニタガンマの逆数の影響だけを取り除けば「物理的な光の量」になるかと言えば、必ずしもそうではない。なので、モニタガンマが2.2なら2.2をかければいい、というような短絡的な思考は真っ先に封殺させてもらった。

あと、全ての画像に補正がかかってるなんて言ったら、今度はバンプや拡散「値」に画像を適用するときにいらん悩みを抱えることになる。画像は見た目通りの値をデータとして持っている。考慮するべきは物理的な光の量。そう考えた方が最終的にスッキリ整理されるだろう。

というわけで、次回はそんな観点からワークフローを考えてみる。更新は遅れる見込み。



Comments

ランバート!!

かなり昔の人みたいですがこういう事を思いつくなんて流石ドイツ人、CGやっていながら初めて知りました(^^:
CGレンダリングの基本的仕組みみたいですね、図解のおかげで陰付けの仕組みがよく理解できました。
拡散と鏡面反射の関係も知っていれば色んなCGソフトでの材質設定でも役に立ちそうです。

全てにオールマイティーなリニアに見える設定値はないと理解していて良いみたいですね。
リニアワークフローと言うのはしたことが無かったですが、レンダ後のポスト処理では殆ど明るさを上げるようにしていました。
今だに自信は持てずにいますが自分の眼を信じて設定するしかない、というかそれが当たり前のような気もします。
次回からの記事ではもっとそうしたポスト処理に自信が持てるような事が書かれるのかも知れませんね、見当違いだったらすみません。

唯、今まで読んでいてガンマ補正はそう気にする事は無いような気もしてます・・良いのかな(^^;

Name
sannzi #u2lyCPR2
Site
URL
Post Date
2011-07-13
Post Hour
22:02:29

Edit

cosθ キターッ!

僕には三角関数の説明が一番難しかったです(そこか!)(笑)
>高校一年生の冬を思い出そう
あれは何十年も前の頃ですなぁ~。(遠い目)
僕がまだチェリーボーイだった.....そんな話は置いといて。(笑)

人の目というものは、良くも悪くも高性能ですね。
見えないものが視えてしまったり。(笑)

V4のような複雑なノード設定がされていると、下手にガンマを弄ると肌色が緑色になったりするので、マテリアルを単純化させる必要もありますね。

Name
hisayan #vdXS97RM
Site
URL
Post Date
2011-07-13
Post Hour
23:47:18

Edit

[連絡]20日まで返信ができなくなります

えー、14日から出かけるので、コメントの返信と続きは20日以降になります。

>sannziさん
調べてみると、CG自体の歴史って結構古いんですよね~。
今はこうして気軽に絵作りできていることも、こういう論文の積み重ねの結果だと思うと
最先端の方々に頭が下がる思いです。
理屈を押さえておくと、いろいろと応用が効きますしいいですよね。

とりあえず、リニアという新しい言葉に惑わされて値を決め打ちすることだけは
やめて欲しいなと思って長々と引っ張ってきました(笑)
次回からは感覚重視というか、従来の方法論をふまえつつ
リニアワークフローを使う場合の本当の利点と問題点を考えてみたいなと思います。

>hisayanさん
はははは、三角比と三角関数は微妙に違うんですよ~(といらん事を言う・笑)
そうですね、もうかれこれ十数年……あ、いやいや(げふんげふん

人間の目って不思議ですね。他の動物の目もそうなのか気になるところです。
最近の環境色に値が入ってたり、拡散色に色をつけてたりする誤摩化し系のマテリアルは
考えるだけで気が遠くなりますね。
かといって、ノードを使わない旧世代のマテリアルも調整する手間は変わらなかったりして。
というわけで、次からはそろそろ実践的な部分にも触れていきたいと思います~。

Name
Kyotaro #NWbyPjWY
Site
URL
Post Date
2011-07-14
Post Hour
04:18:37

Edit

Post Comment

管理者にだけ表示を許可する


Trackback

※このブログにトラックバックを送信する場合、お手数ですが本文中にブログ該当記事へのリンクを含めてください。

トラックバックURL:http://rutenshikai.blog63.fc2.com/tb.php/469-578639bc



Menu

Profile

Kyotaro

確定名:Kyotaro
ネタを探しているらしい。

Categories

Calendar

05 | 2017/06 | 07
- - - - 1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 -

Comments

Archives

Track back

RSS feed

Links

Search

※2011年4月6日のサーバ障害の為、エントリのアドレスが以前のものからズレています。当Blogのエントリにリンクを張っておられた方は、お手数ですがアドレスのご確認をお願い致します。

※Internet Explorer非推奨。