先日リリースしたXi-TRACE R14で搭載した、環境光線源(envl命令)を使ってみたいと思います。
「環境光線源」とは、周囲の景色から発せられる光によって、物体が照らされる様子をエミュレートするもので、ちょっとした間接照明的な使い方を想定しています。マニュアルにも載せた図と説明になってしまいますが、まずは以下の図。
光線源としては、中心座標と半径で定義して、外側に向いた視点(目)と、内側(逆側)に向いた光線源が対になっていて、半径<rd>の球面上に無数に分布しています。視点−光線源ペアは、視点から見えた色(景色、映像)に、係数を乗じた強度の光を内側に向かって発光します。
よって、例えば、周りに赤色の壁が配置されていて、視点の先に赤い壁が見えていれば、その反対側に赤い光が放出され、ぼんやりと赤い光で照明されるようになります。
この光線源は局所光線源(loc命令)のような実体を持たないため、視界に入っても、光線源自体が見えることはありません。半径<rd>は、視点−光線源ペアが分布する球面の半径であることに注意してください。
「環境からくる光」と言うと、その光は通常、あらゆる方向からくるので、「方向性を持たない」のですが、Xi-TRACEの環境光線源はご覧の通り、中心座標を持っていて、指向性を持っています。かつ、視点−光線源ペアの存在する点に対して影処理を行っていますので、間に遮る物体があれば、影になります。
と、言うことで、一般的にとらえる環境光線源とは、ちょっと性格が異なっていることは、ご了承ください。
間接照明の例に使ってみます。「浴室」で作った、作者宅の浴室です。環境照明のあり/なし(before/after)の画像を載せますので、見比べてみてください。
↑before(なし) after(あり)↓
before:上・下、左・右が壁(天井、床)で囲まれた閉空間に、光線源は、正面上方に見えている2つの白い球体だけでした。4方向の壁は、すべて同じ色なのですが、光線源との角度が浅い、正面の壁だけ、少し暗い色合い見えていました。天井が暗いのも、光線源との角度が浅いためです。
after:確かに、正面の壁と天井は少し明るくなっていますが、ある意味、1個光線源を追加した(=光量が増えた)のだから、全体的に明るくなるのは当たり前。光線源を追加したので、物体が落とす影も、1つ増えています。背面の壁が反射した光(間接照明)をエミュレートするため、背面の壁際に環境光線源(envl命令)を配置しています。これによって、背面の壁自体も環境光線源で照らされて、何やら、反射光っぽい陰がついているのですが、ここだけが環境光線源によって変化した部分と見えます。
結論:あまり効果がわからない(1^^;)。確かに、「違い」は見えているのだけれど、結局、環境光線源って、何?という疑問がクリアになりません。
前節の浴室は、モチーフが良くなかったですね。作者宅のお風呂場、モノトーンなので、周りの物体が反射した光で照らしても、その効果が良く見えなかったのだと思われます。
そこで、もっとわかりやすい例でみてみようと思います。白い地面の上に、赤い球体と、更にその上に小さめの白い球体が積み重なったデータに、光線源を一つも設定しないでレイトレーシングしてみます。
光線源を設定していないので、物体を照らす光が何もなく、2つの球体は真っ黒でシルエットしかわかりません。地面がちゃんと見えるのは、属性定義attr命令の中で、周囲光強度<I_amb>を0.50(50%)に設定しているためです。
attr <atr_name>=
{
diff <R_dif>, <I_amb>;
};
この場合、「白い地面が<I_amb>=0.50の強度で自己発光している」と考えることができます。このため、光線源のない世界でも地面だけは白く見えているのです。
しかし、本当に地面が自己発光しているなら、その光で2つの球体も照らされそうなものですが、レイトレーシングの世界では、自己発光する地面を光線源として扱っていないので、地面が他の物体を照らすことはありません。
そこで、赤い球体に環境光線源(envl命令)を設定してみます。
すると、赤い球体が地面からの光に照らされ、下側がぼんやり赤く見えるようになりました。この環境光線源は、赤い球体に合わせて設定したため、上に乗った白い球体からだと影になってしまい、上の白い球体は相変わらず黒いままです。
そこでさらに、上の白い物体にも環境光線源を設定してみます。
白い球体も、地面からの間接照明で下側が照明されるようになりました。単に、下方からの光線源で照らされたのではなく、「外側に見えた景色を内側に放出」しているので、赤い球体と接している部分は、地面からの光が遮られて黒くなっていることがわかります。
更に効果を確かめるため、2つの球体にも<I_amb>を設定して、自己発光させてみます。
白い球体が赤い球体と接する付近は、赤い球体に照らされて赤く光っています。赤い球体も、白い球体に照らされて光っているのがわかります。
データは下でリンクしてあるので、DLして試していただくことができます(env_light.xitr)。データの先頭付近にあるパラメータで、環境光線源のあり/なし、球体自己発光のあり/なしを設定できますのでお試しください。パラメータを0に設定すると「なし」になります。
ぱっと見で、「反射して地面が映り込んでいるだけでは?」とも見えるような効果なのですが、明らかに反射ではないので、自己発光する方も照らされる方にも反射率を持たせて、環境光線源の効果をご覧いただくデータを作成しました。
このデータの世界にも、環境光線源以外の光線源は存在していません。地面のチェッカの内、白いタイルだけが自己発光して下から赤い球体を照らしています。
地面の白いタイルだけが、赤い球体を下から照らしているので、「白いタイル」と、「赤い球体が明るく照らされている部分」の位置関係を確かめていただくことが、このデータの目的です。
動画にして、赤い球体と白いタイルの位置関係が動的に変わるようにしてありますので、じっくりご覧ください。反射による映り込みで白いタイルが見えている部分と、白い光で照明されて明るくなっている部分が微妙にずれていることがわかると思います。反射による映り込みではなく、間接照明されていることの証です。
完成したデータをリンクしておきます。
1) | env_light.xitr |
2) | glow_floor.xitr |
「浴室」の方は、オリジナルのデータを差し替えておきましたので、「浴室」の解説ページからDLしてください。1)は、自己発光する地面の上に重なった2つの球体(赤球と白球)のデータです。2)の方は、自己発光するチェッカ模様の床上を赤い球体が転がっている様子を動画にしてあります。
「浴室」のような、閉空間で最大の効果を発揮する、と期待したのですが、ちょっと期待外れでした。もっと効果を発揮できるシーンを模索したいと思います……。