~下の画像をクリックすると、徐々にライティングが発生するアニメーションが見られます。■はじめに最近、spinさんが、狂ったように更新、詳細な解説をされているのですが(「近日発売予定のコンピュータグラフィックス技術解説書」なんて、散財させてくれるような記事はうれしいやら悲しいやら...)、その中の1つに表面下散乱の解説記事がありました。表面下散乱は、BBSでもリクエストされていたので、とりあえず、もっとも簡単な範囲でやってみました。(表面下散乱:DirectX9)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースmap.bmp:デカールテクスチャ(ただし、現在のプログラムでは、使っていません)あと、実行ファイル、地面のモデル及び、プロジェクトファイルが入っています。■表面下散乱とは表面下散乱は、皮膚をよりよく表現するためのレンダリング方法で、一度皮膚の中にもぐりこんだ光が、皮膚の中で散乱されて拡散光として出てくる様子をシミュレートします。普通のLambert拡散光と、表面下散乱を比較すると、次のように見た目が異なります。使用前使用後そもそも、拡散光はどのようにして起きているのでしょうか?いつもは疑問に思われていないかも知れませんが、拡散光は物体表面から入射した光が物体内部の電子によってランダムな方向に散乱されて、出てきたものです。光の量が多くなれば、その分反射される量も増えるので、光は表面に入射する強さに応じて強く拡散されます。ところが、現実はそう簡単ではありません。物体の組成にもよるのですが、表面から入った光は、何度も散乱されたりして複雑な反射を示します。重要な点は、散乱される光は一点だけで散乱されないということです。物体に入射された光は、物体内部で長い旅をして表面の別の場所から出てくるケースも発生します。別の場所から光が出てくるということは、本来光が当たらない光源の影になった部分にも光が当たるということです。ほかにも、影の陰影が柔らかく見えたりします。これらは、皮膚、ミルク、大理石などの自然物に関して特に顕著な現象で、やわらかく見える物質にこれら多重散乱の効果を含めると、よりリアルなレンダリングが可能になります。表面下散乱の方法は、まだ方法論が確立されていないので、さまざまな方法が考えられます。視点が注目する周辺の領域周辺の光を拾い集めてそれらの合計を散乱光とする方法や、多重散乱を累積して合成した結果を1つの双極子として表現しなおした方法があります。双極子は、物体内部に置く光を放出する点光源と、ちょうどその真上にある光を吸収する点光源でできています。それらの光源による効果は、物体が凸になっている部分では光を放出する成分が強くなり、光がすけた効果を演出しますが、凹んだ部分では、光が吸収される成分が強くなり、より暗くレンダリングされます。今回の方法は、それらよく知られた方法ではありません。流体的な手法をとります。入射された光を適当に拡散させて、光を広がらせます。同時に一部が熱等に変化したりする効果を考えて広がった光を減衰させます。最終的に入射した光と吸収される光が平衡状態に落ち着いた状態が照明結果になります。具体的な方法は、メッシュに照射された光の量をデカールと同じテクスチャ座標にマッピングします。次に、その画像にブラーをかけてぼやかし、そのテクスチャを散乱された結果として照明計算に使います。ブラーをかけた結果は次のフレームでも使用して、指数関数的な光の減衰を表現します。今回はテクスチャ空間でそのまま散逸させましたが、テクスチャにローカル座標系でのピクセル間距離をサンプリングして、その距離に応じて散逸させたり、曲率をマッピングして、それに応じて拡散させるとよりよい結果が得られると思います。■テクスチャへのサンプリング最初のステップは、テクスチャ座標系に入射光をレンダリングすることです。今回は、テクスチャ座標をスクリーン座標に使います。射影空間の座標系は-1から1までなので、スケーリングなどを施します。色は、普通のLambert拡散の計算をおこないます。}ピクセルシェーダは簡単に色を出力します。}■ブラーをかける次のステップは、ブラーをかけることです。これは、テクスチャ1枚だけを張るフィルタリング処理になります。頂点計算では、適当に設定されたポリゴンの位置とテクスチャ座標をそのまま出力します。1フレーム前のブラーをかけた結果を上下左右のピクセルからサンプリングしてぼかします。このときの、それぞれのサンプリングを掛け合わせる強さが減衰率や反射率を決定するので、適当に調整します。ブラーをかけたテクスチャをライトマップとして合成します。それぞれのテクスチャはデカールマップと同じ座標系に存在するので、同じ座標をデカールとライトマップに出力します。}ピクセルシェーダでは、それらを掛け合わせて合成します。これといって強さを決めた理由はありません。}裏ネタ:0426行のコメントアウトをはずすと、テクスチャを使わないライティングが行えます。0427行をコメントアウトすると、デカールテクスチャを張ります。■最後に実に適当ですが、表面下散乱をしました。反射率や吸収率の決定もいい加減ですし、遅れが必ず発生するのでまだまだ改良が必要です。他の方法も吟味していきたいので、これから長くお付き合いしていくことになりそうです。もどるimagire@gmail.com。