Phong の鏡面反射における Schlick の近似式

先日、「『Graphics Gems IV』を譲り受けました」なんてエントリーを書いた手前、中身にざっと目を通してみるかと思いまして、ぱらぱらとページをめくってみたり目次を眺めたりしていたんですが、そこに"A Fast Alternative to Phong's Specular Model by Christophe Schlick"なんて項目を見つけました.

...あれ?Phong Specular Modelに対する代替モデル?Schlick?

ちょいと思い当たることがあったので、ページを見てみると

Sn(t) = \frac{t}{n-nt+t}

なんて式が書いてあるじゃないですかっ

あ~、これがいわゆる「Schlick の近似式」ってやつですか

慌てて、自分の過去に書いたシェーダーコードを読み返してみるとちゃんとこのままの式で使っていましたよ.

実装当時、どこかサンプルコードで Schlick の近似式の存在を知って、こういった知識ってのはどこで仕入れてくるんだろう?と疑問に思ったのを覚えています.

...こういった関連書籍だとか論文だとかには、ざっと目を通しておいた方が良いんですね...

さて、折角再度巡り会った(?) Schlick の近似式なので、復習も兼ねてどういったモノなのかを整理してみることにしました.

Phong 鏡面反射モデルに対する Schlick の近似式の概要

まずは、Phong の鏡面反射モデルとSchlick の近似式の関係を把握してみることにします。

Phong の鏡面反射モデルは、

t = cos(\theta) = N \cdot L
(N = 法線ベクトル/L = ライトベクトル)

としたときに、

Rs = t^k
(k = 鏡面反射指数)

とするモデルでした.

この t^k というべき乗計算を実装するときには、"pow"などの関数を用いて実装することになると思うんですが、これが比較的遅い処理になるので、

Sn(t) = \frac{t}{k-kt+t}
(t=N \cdot L,k = 鏡面反射指数)

といった、(精度を犠牲にする代わりに)軽い処理負荷で計算しようというのが Schlick の近似式なのでした.

Phong の鏡面反射モデルと Schlick の近似式の違い

ざっくりと内容が把握できたので、Phongの鏡面反射モデルと Schlick の近似式モデルの違いを把握しておくことにします.

まずは、Phongのモデルをグラフ化したもの

次は、Schlick の近似式をグラフ化したもの

こうやって比較してみると、確かに似たような形にはなっているけれども、意外にフィッティングが悪いかなぁ...という気もしますね

まぁ、所詮は処理速度とのトレードオフになる近似式といったところなのでしょう.

Schlick の近似式の範囲

Schlick の近似式の存在を初めて知ったときには、べき乗計算の近似式だと勝手に勘違いしてしまっていたので、底の範囲と計算結果の精度のことを考えていませんでした.

これ、式を眺めてちょっと考えればわかることなんですけど、あくまでもPhongの鏡面反射モデルに対する近似式なので底の範囲は、0.0~1.0の値の時に近似になっている事に注意する必要があります.

そんなわけで、範囲外のケースとして-1.0 ~ 0.0 の範囲のグラフも眺めておくことにしましょう.



上が、Phongの鏡面反射モデル(っちうか、底がマイナスになる場合のべき乗計算)で、下がSchlickの近似式になります.

まぁ、根本的にグラフの特性が違うことがわかります.

まとめ

いまどき Phongの鏡面反射モデルに関するSchlick の近似の話をしたところで面白みがあまり無かったと思うのですが、日々の情報収集ってのは大切なんだな...と思いながら、近似式を眺めてみました.

もっと精進せねばいけませんね

参考

"A Fast Alternative to Phong's Specular Model by Christophe Schlick"

http://page.mi.fu-berlin.de/block/htw-lehre/wise2012_2013/bel_und_rend/skripte/schlick1994.pdf

『Graphics Gems IV』に載っている論文と同じ論文のpdfです.

Graphics Gems IV (IBM Version) (Graphics Gems - IBM)

Graphics Gems IV (IBM Version) (Graphics Gems - IBM)