background

シャドウマップ・その宿命。

2006年09月17日(Sun)

なんだかしばらくぶりの更新だなあ(笑)
まあその間何をしていたかというと、自分ちのブログでG2 Jamesのレビューを
書いていたりなんぞしてたわけで、興味のある方はこちらまで(宣伝)。
http://rutenshikai.blog63.fc2.com/blog-entry-148.html
 
***
 
前回、シャドウマップとは光源の視点からZ値を取得し、そのグレースケール画像を
レンダリングしたものと、実際の距離を比較した結果から影を求める手法だと説明した。
そのZ値を表すグレースケール画像のことをそもそもシャドウマップと呼ぶわけだが、
端的に表現すればシャドウマップの欠点は、まさにそれが「画像」であるという点に尽きる。
 
まずは一つ目は、画像の画素数による問題だ。
 
シャドウマップによる影の描画では、実際のレンダリングの前に一つのライトにつき
「Z値の取得」「Z値をマッピングしたもの」「実際の距離を表したもの」と、
合計3度シーンをレンダリングしていることになる。
この中で、「Z値をマッピングしたもの」と「実際の距離を表したもの」は
カメラからの視点なので、そのレンダリングサイズは最終的なレンダサイズと一致する。
では「Z値の取得」は、一体何ピクセルでレンダリングされているのだろう?
ライトのパラメータパレットにある「影の精度(英語版ではMap Size)」が、その答えだ。
 
121-1

「影の精度」はデフォルトの状態では256となっている。
これは256×256ピクセルで「Z値の取得」のレンダリングを行うということである。
つまり「影の精度」とは、シャドウマップの1辺のピクセル数のことなのだ。
ちょっと想像してみよう。256×256ピクセルとは、随分と小さくはないだろうか。
このサイズでシーン全体をレンダするのだから、細かい形状まで描画できるはずがない。
描画できないとどうなるのかというと、ようするに影がボケてしまうのである。
 
これはシーン内のオブジェクトのサイズが大きいと特に顕著になる。
人物のみでテストレンダをした時には描画されていたはずの影が、
背景を追加した途端に薄ぼんやりとしか出なくなった、というようなことはないだろうか。
シャドウマップは通常シーン全体を含むように作成されるので、シーン全体のサイズが
大きくなれば、相対的に人物などは数ドット分の小さい範囲でしか描画されなくなる。
それにさらに影のぼかしがかけられて、ほとんど判別できないほど微かになってしまうのだ。
 
121-2

もちろん、シャドウマップのサイズを大きくすれば、相対的に影の精度は向上する。
パラメータパレットでは、「影の精度」は最大1024まで上げることができる。
だが、ちょっと想像してみよう。1024×1024ピクセルとは、随分と大きくはないだろうか。
少なくとも自分は普段そんな大きいサイズでレンダリングすることはほとんどない。
1024×1024ピクセルといえばデフォルト(256×256ピクセル)の16倍のサイズである。
単純に影の計算時間も16倍になり、さらにそれでもくっきりとエッジが立つとは限らない。
シャドウマップは影をぼかすのは得意だが、逆にエッジを立てるのは苦手なのだ。
 
一つ目が画像の画素数による問題なら、二つ目は画像の階調(bit数)の問題だ。
 
シャドウマップによる影の描画では、最初に取得したZ値をマッピングする都合上、
一度グレースケール画像としてシャドウマップを保存する。
するとシャドウマップは(大抵のレンダラにおいて)、8bit=白黒256階調で保存される。
これはつまり、シーン全体の奥行きを256段階でしか表現できないということだ。
光源から見たシーン全体の奥行きが、例えば2.5メートルなら約1センチずつ、
256メートルなら1メートル単位でしか奥行きを判定できない。
ところが3度目の「実際の距離を表したもの」をレンダリングするときは実数値で計算されるので
シャドウマップと実際の距離に差が出てしまい、階段状のノイズが発生する。
 
121-3

大きなPropや浅い角度からライトを当てた時に、度々見られる現象の原因がこれである。
この階段状のノイズを回避する為に、シャドウマップではあらかじめZ値の抽出時に
オブジェクトを設定されたオフセット値だけ実際の距離からずらして計算する。
これがライトの特性パレットにある「影の偏り(英語版ではShadow Min Bias)」だ。
 
121-4

人物の足は接地しているはずなのに、地面の影が浮いてしまって困惑した経験はないだろうか? 
これは、バグでも設定ミスでもない。シャドウマップの影を計算する時だけ、
オブジェクトは実際にその(後方の地面にめり込んだ)位置に存在しているのである。
人の顎や鼻の穴に影が落ちないのも同じ原因だ。
影を落とすオブジェクトと影を受けるオブジェクトの間隔がオフセット値よりも狭い場合、
影はそれを受けるオブジェクトよりも後方で、ようやく発生するのである。
 
121-5

このオフセット値はもちろん調整できるが、もともと階段状のノイズを軽減する為の
パラメータであるから、オフセット値を小さくするとノイズが発生してしまう。
ノイズができるギリギリのところまで、レンダリングしながら確認するしかない。
 
このように、シャドウマップは精密な描写を苦手とする。
これは時間やマシンパワーなどのリソース(資源)を費やせば改善できるという問題ではなく、
原理的な限界なのだ。
 
だが、まったく改善できないかというと、実はそういうわけでもない。
やや誤魔化しに近い限定的な方法で、多少は影の質を向上させることができるのである。
 
長くなったので次回につづく。
 
■頂いたコメント■


コメント:(Henriette)
あーなるほどっ
それでステージ上だと影が綺麗におちてくれなかったりするワケですね。
最近では諦めてレタッチで影まで弄るようになってましたよ。。。(^^;

コメント:(pines)
そうかぁ、
今までレンダしながら、変だなぁ何でだろう・・と思ってたところの理由がわかりました。何だかスッキリ。
対策編、楽しみに待ってます。

コメント:(sannzi)
今回も詳しい解説有難うございます。
影の精度は良く分かりました。
前回の講座を見てからVueでもシャドーマップを使うようになったんですが、その品質設定内容が分かりました。
Vueではデフォルトで512×512となっているようです。
又、実レンダリングサイズとの比率で設定も出来るようです。
Vueの話で申し訳ありませんでしたが納得したものですから。
影の偏りは理屈は良く理解できなかった物の、実際数値を変えてその違いを確認できました。
又、Vueの事ですがシャドーマップと言うのは今まで正体が良く分からなかったので敬遠していたけど、実際使ってみると良いものだと思いました。
影が柔らかくなるし早いし、これからは積極的に使おうと思います。

コメント:(linkinpark)
今回も非常に参考になります。(講義はすべてローカルに保存してます。)説明が明確でわかりやすいですね、学校などで3DCGの講師をなさっておられるのですか?

コメント:(Kyotaro)
>Henrietteさん
そうですねー。背景を入れたいときは本当にてこずります。
私も影はレタッチです……というか影用のレンダ画を統合するのがレタッチの前手順みたいな感じになりつつあります(笑)
 
>pinesさん
おかしくなるところには、ちゃんとそれなり理由があるんですよね。
原因がわかっても、納得できるかどうかは別ですけれども……(笑)
対策編は人力作業になる見込みです(^^;
 
>sannziさん
他のソフトでどういう表現になっているかを調べるのもいい勉強になりますよね。Shadeのシャドウマップもデフォルトが512x512なので、Poserが小さいんだと思います。(ライトが最初から3つあるから軽くしているのかも?)
表現したい光の雰囲気によって、影の種類も使い分けられるようになったらいいですよね。色々試して下さい(^^
 
>linkinparkさん
保存までしていただいてありがとうございます(^^;
自分で読み返すとまだまだな表現もチラホラと……(汗)
3DCGは全部独学ですね。今まで教わったことも人に教えたこともなかったので、うまく伝わるか勉強中な感じです。




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非推奨。