Half Lambert Diffuseの正規化

ゲームのレンダリングで、たびたび使われるHalf Lambertシェーディングを正規化してみます。

Half Lambert Diffuse

Half Lambert Diffuse(ハーフランバート拡散)反射は、Valve社が2006年のSIGGRAPHのCourseで発表しました。(初出は他にあるかもしれませんが、Valve社が発祥で間違いないと思います。)定義としては、NdotLを2で割って、1/2足して、2乗したものとなっています。Half Lambertそのものは、物理に則したものではありません。しかし、ライトの定義が単純な場合は、どうしてもライトの当たってない面(Diffuseが0になる面)が多くなります。このような場合にHalf Lambertを用いることで、ライトの当たってない面にも、色の階調を作り出す事が出来るので、場合によっては非常に便利です。典型的なゲーム向け技術といえると思います。

Half Lambert Diffuseの正規化

Half Lambertの式は、ちょうど余弦の半角の公式sqrt((1+cosθ)/2)の4乗になると思います。Lambertの単位面積当たりの放射束の分布がcosθだったのに対し、Half Lambertではcos^4(θ/2)となります。
Radianceを無理やり定義するならば、Lambertの様に一定ではなく、cos^4(θ/2) / cosθとなると思います。つまり、観測者との角度が増すに従ってRadianceの値は大きくなり、90度付近で∞に発散してしまいます。
これのBRDFを積分を行って正規化したいと思います。Half Lambertでは平面の法線方向からIrradianceが照射された場合に、観測者と平面の成す角が90度を超えてもRadianceが発生していますので、球全体を積分する必要があると思います。ですから、θを0~πで積分しますが、置換で積分範囲を変更し、倍角の公式を適用します。定義域が一意になるので、さらに置換積分で計算します。

Lambertよりも若干ですが大きい値になりました。印象的にはもっと大きな値になると思ってました。これでHalf LambertとLambertを同時に用いても、双方とも正規化することで、エネルギーを保存することが出来ます。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中