吸収

absorption.png
absorption.jpg
上の絵はBlenderのチュートリアルサイトからとってきました。

全面吸収

白色光が全波長にわたり、全面吸収された場合には、表面色は灰色か黒になる。
選択吸収された色と選択反射された色とは補色の関係になる。

深度マップを使った吸収のシミュレーション

半透明物質のシミュレーションで最も重要な因子の一つが吸収である。
光は物質に移動するほど、散乱して吸収される。
この効果をシミュレートするには、
光が物質中を移動した距離の尺度が必要だ。

この光が物質中を移動した距離を推測する一つの手法が、深度マップの利用である。

この技法はシャドウマッピングにかなり似ていて、
リアルタイムレンダリングに実用的だ。

ab.png
  1. ライトの視点からシーンをレンダリングし、ライトからの距離をテクスチャに格納する。
  2. この画像を、標準的な射影テクスチャマッピングを使ってシーン上に射影して戻す。

1.を実現するには、フレームバッファオブジェクトを使う必要があるのかなぁ
シェーディングする点が与えられれば、レンダリングパスでこのテクスチャを参照し、
光線が表面に入った点$d_i$のライトからの距離を得られる。
ライトと光線が表面を出る点$d_0$の距離からこの値を減算し、
光が物体を移動した距離および推定値が得られる。

この技法の明らかな問題は

  • 凸状の物体でしか動作しないこと

なので、物体上の穴を正確に計上できない。

これは実際には大きな問題ではないが、
深度剥離(depth peeling)を用いて
オブジェクトのレイヤーを1つずつ剥がし、
問題を回避できるかもしれない。

静的なオブジェクトには、各点の方面の厚みの近似値を表すマップをペイントしたり、
あらかじめ計算できると思うかもしれない。

しかし、深度マップを使う利点は、それが入射光の向きを考慮し、
アニメーションするモデルでも動作することだ。(深度マップを毎フレーム生成し直せば。)

次のプログラムが、ライトからの距離をテクスチャにレンダリングする方法の実例だ。
これらはアプリケーションがライトビュー用にモデルビュー行列を準備していることを前提とする。
OrderIndependentTransparency.pdf

サポートサイト Wikidot.com