元記事:harkyman.com ≫ Blog Archive ≫ Controllable shadow intensity and color


カラーシャドウ


by harkyman氏


私が作業を行った Blender 用の開発プロジェクトにはいつも、私が遭遇した制作上の問題を直接反映しています。BlenderPeople はアニメーションベイキング、Floor Constraint、Visual Keying、Python API の拡張を生み出しました。The Beast は Sequencer と Action エディタの選択方法を改良しました。

その他に The Beast の途中で出会った問題の一つが影のコントロールでしたが、制作中はソースに取り組む時間はありませんでした。
ちょうどいい光源の位置と明るさを得ても結局、一、二ヶ所影が暗すぎる場所を発見してしまうことが何度かありました。Matarial と Lamp のバランスは非常に微妙で、私は Lamp の追加(暗すぎるエリアを直す標準的な方法)や、Lamp の強さを変更するのが嫌でした。
もし単に目障りな Lamp の影の強さを落とすことだけできれば、苦労して作成した全体的なシェーディングや外見も簡単によくなるとは思いませんか?

もちろんそうですよね!
それができるようになったのです。

このパッチは、RGB カラーを Lamp の影に適用できるようにするものです。これは「現実世界」ではサポートされてはいませんが、皮肉なことに3Dの世界では、アーティストたちが自分の作品内でもっとリアルな表現を行うために、物理世界の制約を回避し時間を節約する技術とツールであふれているのです。

最初は「機能の検証」による技術資料、その次は、アーティストのための画像と用途の紹介です。


テクニカルサイド


下の注釈付きの画像(クリックで拡大)では、影を投影する Spot Lamp とテクスチャ付きの平面の間に、球を5×3で配置しています。
・最上段はデフォルトの影(RGB 0, 0, 0)です。
・中段は、影の RGB 値を0.5, 0.5, 0.5もしくは半分の強さにしています。
・最下段は RGB 1, 1, 0の黄色の影です。

左から右へのそれぞれの列は以下を示しています。
[wiki]-影の Lamp2つ、Buf-Shadow の Classic、それぞれ赤と青に光を設定、すこしずらして交差させています。
-影の Lamp1つ、Buf-Shadow の Classic、白い光。球の Material の Alpha を0.5、ZTransp を ON。
-影の Lamp1つ、Buf-Shadow の Classic、白い光。球の Material の OnlyCast を ON。
-影の Lamp1つ、RayShadow、白い光。球の Material の Alpha を0.5、RayTransp を ON。
-影の Lamp1つ、Buf-Shadow の Irregular、白い光。球の Material の Alpha を0.5、ATrans を0.3。[/wiki]

平面にはシンプルなテクスチャを適用、また、Irregular と RayShadow の Lamp から半透明の影を受け取るとるため、TraShad を設定しています。



この図の興味深いポイントは、
[wiki]-強さが半分の影が、ちゃんと Irrecular Buffer や RayTransp からの、すでに減衰している(半透明の)影をさらに薄くしている。

-黄色の影は RayShadow の列からの、すでに青になっている影をちゃんとグリーンにしている。

-二つの Lamp の列に見られるように、カラーシャドウは他の Lamp の照明を正しくミックスしている

-中央の OnlyCast の列もちゃんと現れている。[/wiki]

デフォルトの影の濃さ(RGB 0, 0, 0)で、レンダリングコードにこの追加が行われる前ときっちり同じに表示されるはずで、実際そうなります。下の画像(クリックで拡大)は、上からの球のサンプルと、Blender 2.46でレンダリングされた参照画像の両方を PhotoShop で合成し、アルゴリズムの違いを示したものです。わずかな違いもわかるよう、コントラストを大幅に上げています。ごらんのとおり、上の段の投影する光が完全に消えており、参照した方法と新しい方法の二つのレンダリング画像が全く同じことを示しています。



Blender ソースへの変更は最小限です。影の処理コードは上手く整理されており、私は実際の計算式を二つの場所に追加するだけで十分ということがわかりました。
数箇所に条件の拡張を少し、そしてもちろん、Lamp 構造体への RGB 値の追加も行いましたが、全体的な変更は驚くほど小さいものでした。ここに実際のエンジンの影を設定するコードの一部を示します。
if (i_noshad>i && !(lashdw[0]==0 && lashdw[1]==0 && lashdw[2]==0)) {
	add_to_diffuse(shr->shad, shi, is, lashdw[0]*(i_noshad-i)*lacol[0],
		 lashdw[1]*(i_noshad-i)*lacol[1], lashdw[2]*(i_noshad-i)*lacol[2]);
}
基本的は、影があり、その影がデフォルト状態の(0,0,0)でない場合、その影の色に対応し、表面上に少しだけ光を追加してやるということです。

このコードは Irregular Buffer Shadow の透過と、RayTransp、そして Texture Lamp を処理するところにあります。

影を投影する Lamp が15個あるテストファイルでは、非常に小さいバンプが見えることで少し遅くなるものの、レンダリング時間はほぼ同じです。

2.46での5回の平均レンダリング時間:24.34秒

パッチ適用後(2.48)での5回の平均レンダリング時間:24.54秒

2.46とパッチ適用後(2.48)のバージョンは両方とも同じPC、同じコンパイルオプションなどでビルドしています。両バイナリで唯一違うのはパッチコードだけです。

以下はこの試験のオリジナルのレンダリング画像と .blend ファイルです。

.BLEND ファイル

2.46でレンダリング

2.48でレンダリング


アーティストサイド


私はこのカラー(そしてテクスチャ付)シャドウが、サイケデリックな動画やその他奇妙な物を制作する人たちの興味を引くことを確信する一方、制作作業におけるシーンのライティングにも本当に便利だと思っています。

前述したように、レンダリング画像を正しい見た目にするのは、シェーダと Material のオプション、そして強さ、色、Lamp のタイプのバランス調整です。

私(そして他の人)の作品では、影の濃さ以外はすべて万全なのに、ということがありがちです。シェーディングはいい感じ、全体的な Lamp の強さも完全、なのに影だけは暗すぎるのです。Hemi Lamp や Sphere Lamp、Amb値 や、更に Ambient Occlusion で大抵はこれを修正するのですが、全体的なシェーディングやライティングは悪くなるでしょう。

このエレガントな解決策は、望んだエフェクト ― もっと低い濃度の影 ― を、影が投影されない、いかなる物にも光を加えずに成し遂げます。

下の3つのサンプルは、The Beast からの制作中のフレームと販促用ショット、一組のレンダリング画像です。販促用ショットと制作中のフレームの両方で、前述の問題、影の濃さといいライティングのジレンマに遭遇しました。

制作中のフレームのケースでは、下のように、最終的には単に Sphere Lamp を追加し、濃い影のエリアに対し、Lamp の距離と強さを注意深く設定しました。最終的にはうまくいき、締め切りにも十分間に合いました。
しかし、このショットはまだ、他の影の問題のあるエリアに悩まされていました。時間の都合で対処できなかったのと、元々の問題のエリアが明るすぎたからです。
最初の画像は問題の物です。二つめの画像は同じフレームを2.48を使い、中ぐらいの強さの青の影でレンダリングしたものです。時間は、
この修正をした場合:10秒、1回再レンダリングし直してします。
Lamp を追加した例:10秒、10回再レンダリングして正しいかどうか確認しています。





通常の影
 

カラーシャドウ


次のサンプルは、私の本の販促用ショットです。静止画用にライティングを調整しても、彼女の顔にかかる、頭髪の Strand の影が濃すぎる状態でした。このショットへの最初の進出において、私はこのショットの二つのレンダリング、影付きと影なしバージョンに頼り、影の濃度がリアルになるよう、これらを PhotoShop 上で手作業で処理する必要がありました。最終的に私は、後でカラーシャドウ機能により再レンダリングしてみることにしました。単純にメインの Spot Lamp の影を薄めた結果、特別な処置やレタッチは何ら必要とせずとも、完全にレンダリングそのままで大丈夫でした。

このように、この機能は厳しい締め切りの中で、20分を節約してくれたのです。そして、アニメーションの一部であった場合、不可能を可能にしてくれるでしょう。
皆さんがごらんになっているレンダリング画像は再出力されたサンプルですが、これらのオリジナルの高解像度のレンダリング画像は現時点では私は利用できないためです。




 


前述の二つのサンプルでは、このエフェクトが単純に Amb 値を上げた、もしくは別の影なしの Spot Lamp で暗い部分をフィルするのとどう違うのかが重要です。このテクニックでは、他のすべての影が完全な値を保っています。カラーシャドウ Lamp のあたっていない領域は、このエフェクトに「苦しめられる」ことはありません。実際、ほとんど Spot Lamp をローカルで指向性の Amp 値のように使用するのと同じです。両サンプルとも、胴体の近くにある腕により作られる影の強さがどれぐらい和らいでいるかに注目して下さい。

更に、この機能がオブジェクトやキャラクタが極めて近くにある時の処理に使用するのがベストであることを如実に示しています。よく、あるオブジェクトが他のオブジェクト上に強い影を投影することがありますが、アーティストにとってこの機能は、その強さを和らげ、状況をもっとリアルにするための、シンプルですばやい方法なのです。

最後はインテリアのショットです。このセットの Mesh の構造の性質上(長くて薄い Face が大量にある)、Approximate Ambient Occlusion は上手く動作しません。そのため、セット全体に影の Lamp を慎重に配置する必要がありました。
水準を満たすようなインテリアライティングにするために、すでに多くの作業を行っていることもあり、二つのレンダリング画像の違いはわずかです。しかし、その下の「差分」の画像は、これらのレンダリング画像の間に数学的に違いがあることを見せています。





 


おわりに


カラーシャドウは物理的に正確ではありませんが、これがプロダクションアーティストにとって便利なツールであるという単純な事実から、ここ数年の Blender 以外のプロ用3Dパッケージには含まれています。すでに私自身の制作作業において時間を節約し、いい結果を生み出しています。

この機能に関心のないユーザは、この新機能にわずらわしい思いをすることは全くありません。インターフェイスは LampButtons の Shadow パネル内の単一のカラーボタンのみだからです。何もしなければ、この機能はデフォルトの黒の影であり、これは Blender が現在、影を生成しているのと同等の機能と外見です。

技術的見地からみても、ソース上のこの機能のための変更点は、既存の影のコードが非常に明快で巧妙な機構であるため、かなり小さいです。

訳者より
これ以降はパッチの段階での記事のため、割愛します。
この記事の翻訳についてご快諾いただいた harkyman氏に感謝します。
Thank you, harkyman.


元記事:harkyman.com ≫ Blog Archive ≫ Controllable shadow intensity and color