~下の画像をクリックすると、通常のランバート照明からOren-Nayer照明の効果が次第に強くなるアニメーションが見られます。照明モデルを扱います。Valientさんのサイトが元になっています(ShaderX2でも発表されるようです)。(粘土ライティング:DirectX9)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースあと、実行ファイル、モデル及び、プロジェクトファイルが入っています。Model」の題目で詳細な解説が行われています。拡散照明モデルと呼ばれることが多いです。照明モデルは、ランバート拡散を一般化したモデルです。した表面にふさわしい照明モデルを提唱しました。金属照明モデルのように、表面を仮想的に細かく見たときのマイクロファセットを導入し、拡散照明を拡張しました。照明モデルは、視線に依存する拡散光のモデルです。表面に凸凹があるとすると、視線方向とライトの向きが近いと、明るい部分が多く目に入ってきますが、視線とライトの向きが離れていると、暗い部分が多く目に入るようになります。効果が含まれています。マイクロファセットの向きが法線の向きとガウス分布の割合で離れている場合の計算をしました(その例の前に、一般論も展開されています)。マイクロファセットの分布の分散で、D=0のつるつるな表面の時には、A=1,B=0になって、ランバート拡散モデルと一致します。ae-alは、法線と垂直な平面へ射影したライトベクトルと視線ベクトルなす角度です。図で示すと、次のような各項の計算をしています。■プログラムでは、プログラムを見ていきましょう。今回は、ピクセルシェーダでほとんど済んでしまいます。In.Eyeを入力します。最初にsin(M1)tan(M2)の計算をします。この計算には、テクスチャによる参照をします。いれて、テクスチャを使って計算をします(実際には、視線からの輪郭部分で誤差によるノイズが出てしまうので、視線の輪郭部分で負の値を防ぐために0クランプしています)。}テクスチャには、次のような、sin(M1)tan(M2)を計算したテクスチャを使います。実際には、左上の部分は値が負です。色が真っ赤な部分は、絶対値が大きい負の部分になります。使って算術的に求められています。テクスチャを求める関数は、次のようになります。}ピクセルシェーダの残りの部分は、計算式どおりに求めます。思ったよりも重くはなさそうですし、使っていっていい気がします。もどるimagire@gmail.com。