こんな感じでレンダーされているとする。
各レンダーパスの計算式は以下で成り立つ
------------------------------------------------------
diffuse*RawGI = GI
diffuse*RawLight = Lighting
GI + Lighting = TotalLighting
reflectionFilter*RawReflection = Reflection
refractionFilter*RawRefraction = Refraction
TotalLighting + Reflection + Refraction + Specular = Beauty
------------------------------------------------------
レンダーパスはAOVsにしてexrを用いて作成した。
nukeでLayerContactSheetノードを用いて表すとこんな感じ。
まずは、
------------------------------------------------------
diffuse*RawGI = GI
diffuse*RawLight = Lighting
------------------------------------------------------
から、
diffuse |
RawGI |
RawLighting |
で掛け算(multiply)して
ここでは、Multiplyノードの中のA、Bチャンネルでチャンネルを指定している
がShuffleノードをつかって、
とやっても可能。
できあがったGIとLightingを足して
TotalLighting |
と同様の方法で、ReflectionとRefractionを得るのだが、実はこの最終的に再構築しようとしているBeautyは
viewerの右上にある「cliptest」で確認するとわかるのだけど、1以上の値がある。実際には、exrはダイナミックレンジを収録できるので、
とこんな感じで、1以上の値を確認できる。
これをtargaのような8bitの画像でレンダリングすると、
こんな風に1以上の値は自動的にクランプされ、「cliptest」をオンにしてもダイナミックレンジ領域(?)が確認されない。
これがどのように影響されるかというと・・・
たとえば、クランプされた画像(要するこれは8bitの画像と同じことであるが・・・)でBeautyを再構築すると
という具合にハイライトの部分がいまいち上がりきらない画像になる。
これは、 今回のケースの場合
------------------------------------------------------
reflectionFilter*RawReflection = Reflection
------------------------------------------------------
の部分でのRawReflectionが
exrを直接viewerで確認 |
exrをクランプしたものをviewerで確認(8bit画像を想定) |
という感じで、8bitの画像でも、ダイナミックレンジを持っている画像でも、見た目はハイライトで白く飛んでいる部分があるが、実際にはレンジの違いがある。
RawReflctcionをcliptestで見た場合 |
ReflectionFilter |
exrに掛け算をして暗くしてみた例。1以上で飛んでいたハイライトの中にグラデーションが生まれる。 |
exrをクランプしたもの(8bitを想定)に掛け算をして暗くしてみた例。1以上で飛んでいたハイライトがくすんでつぶれる。 |
オリジナル |
exrからBeautyを再構築 |
exrをクランプしたもの(8bitを想定)からBeautyを構築 |
という差が生じる。もちろん、ピクセルの値が1を超えないものであれば、問題が無いケースも多々あるであろうが・・・
参考にさせていただきました!
ReplyDeleteとてもわかりやすくまとめていただきありがとうございます!