~下の画像をクリックすると、異方性のパラメータを変化させたAshikhmin照明の効果がアニメーションで見られます。照明モデルを扱います。(異方性ライティング:DirectX9)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースあと、実行ファイル、モデル及び、プロジェクトファイルが入っています。らよって、提唱された異方性の照明モデルです。2000での論文でしょうか。ここ最近、spinでも取り上げられていたこともあって取り組んでみました。照明モデルでは、入射光照度と反射光輝度の比であるBRDF(双方向反射関数)を求めるのにすべての精力がさかれます。最初に、BRDFを2つの成分に分けます。l)は、鏡面反射光の成分です。eは視線への方向ベクトルです。最初に鏡面反射成分を見ていきましょう。n・lが、使われます。nは面の粗さをあらわすパラメータです。l)Li(l)cosθldωlに、入射方向の余弦が入るので、その項をキャンセルするために挿入します。ここで、Lr(e)は、放射された放射輝度で、Li(l)は入射された放射輝度です。e)を満たしていません。鏡面反射の特性から、相反性を満たすBRDFを考案しました。kは、eかlのどちらかになります。ここで、金属物質が持つFrenselの項を追加しました。らは、このBRDFに異方性を追加しました。異方性は、反射のパラメータnを拡張します。nに関して、従法線ベクトル方向uと、接ベクトル方向vに応じて反射率が違うものと設定します。ここで、従法線ベクトルや接ベクトルは、それぞれの局所座標で直行する必要がありますが、場所に応じて向きは異なります。従法線ベクトルや接ベクトルは、CDの動径方向と、円周方向に取るのが適切でしょう。らによるBRDFは、次のようになります。BRDFと一致します。らは係数cも求めました。らは、拡散光成分に関しても議論しています。モデルで使われるBRDFの式になります。モデルは結構複雑です。簡単なのは、拡散光です。拡散光のBRDFを簡単に計算できる部分と、複雑な部分に分け、(1-u)5のような複雑な項を含んだ部分に関しては、テクスチャからサンプリングします。v)5)このテクスチャTex0は、次のようになります。}鏡面反射光のBRDFもテクスチャサンプリングを利用して、複数のテクスチャの積として表現します。BRDFを適当に分割します。1-(h・n)2のように描けるので、BRDFは、次のように描けます。v2/(1-u2)さて、Tex2は、u→1のときに指数の分母が発散します。-v2/2u→1があるので、発散を防ぐことができます。テクスチャとして使うために、Tex2にオフセットを設定します。h・uは、正の値も負の値も取りうるので、0.5のオフセットを入れて、テクスチャの中心をずらします。スケールファクターβも導入します。nuの値は、10から10000程度まで動くので、テクスチャの範囲がいい感じに収まるようにスケールを入れて調整します。今回は5.0を入れましたが、実際は、√nuぐらいがいいのでしょうか。v)は、次のようになります。(β(v-0.5))2/(1-u2)また、BRDFで読み込まれる値はスケールとオフセットで次の変更を受けます。βテクスチャTex2は、次のようになります。F(u)/(ε+uv)のようにすることによって、発散を防ぐことができます。テクスチャTex1は、次のようになります。項は、Schlickによる近似を用いました。}■プログラムでは、プログラムを軽く見ていきましょう。今回もピクセルシェーダでほとんどの作業をこなしています。頂点シェーダから視線ベクトルや光源ベクトルをもらい、ピクセル単位で正規化しつつハーフベクトルなどを計算します。後は、それぞれのテクスチャをサンプリングして、係数を掛けることによって値を整えて描画します。}図で見ると、次のような感じでしょうか。■最後に実用にはなるようですが、パラメータの調整は細かくする必要がありそうですね。もどるimagire@gmail.com。