~■はじめに今回は、やっていそうでやっていなかった法線マップをリアルタイムに計算します。ある波のシミュレーションをして、その高さから法線マップを生成して、フォンの鏡面反射則でライティングしています。上の絵の左上のよくわからない物が波のシミュレーションで、赤色成分が高さ情報、緑色成分が高さの変化する速度になっています。その下が、その高さに関する法線マップです。背景はビットマップを表示して、ライトの位置は適当に調整しました。下のファイルがソースと実行ファイルです。Cg言語)まぁ、いつものように適当にファイルが入っています。波のシミュレーションのフラグメントプログラム。法線プログラムの生成のフラグメントプログラム。照明計算の頂点プログラム。照明計算のフラグメントプログラム。ビットマップファイルの読み込み。ビットマップファイルの読み込み。sky.bmpあと、実行ファイル及び、プロジェクトファイルが入っています。最初に波の作り方を説明しましょう。方法は載っていいますが、手元に本がないので、適当にプログラミングしてみます。波は、テクスチャのそれぞれのテクセルをばねでつないだ粒子の集まりと考えます。ばねの動く方向は高さ方向だけにしか動かないことにします(物理的には横波だけを扱うことになります。現実にはそのような媒質は存在しませんが、光の反射に寄与する部分だけ抽出したと考えればよいと思います)。運動方程式には、位置と速度の2つの自由度があるので、2つのバッファに値を保存します。位置をテクスチャの赤色成分、速度をテクスチャの緑色の成分に入れます。128からの差で高さや速度を表現します。);位置には速度を(0.5で引いて1、色の強さが128の時に変化0になるようにして)足します。速度は、高さの差を足しこんで、変化させます。今回は、フラグメントプログラムだけを使いましたが、頂点プログラムとフラグメントプログラムを使えば、より効率的に(DirectX8世代の処理で)プログラムができます。次に、波のシミュレーションで求められた高さ情報から、法線マップを作ります。法線マップは、法線ベクトルをテクスチャなどのマップに落とし込んだものです。法線ベクトルの求め方ですが、接ベクトルが法線ベクトルに直行することを利用します。今回の場合は、高さ情報だけしか変化しないので、X軸及びZ軸の方向に関する高さの偏微分が接ベクトルの方向になります。1)の式によって求められます(左手座標系ですね)。法線ベクトルを作成します。■ライティング次の段階は、法線マップを使った鏡面反射光の計算です。今回は、手を抜いて、曲面計算を省いて平面を張りました。いうことで、頂点プログラムの出力は、視線ベクトルと光源ベクトル及び法線マップのためのテクスチャ座標をテクスチャ座標出力に吐き出します。視線ベクトルや光源ベクトルはローカル座標で取り扱います。}フラグメントプログラムでは、法線ベクトルを取り出したり、各種ベクトルを正規化して単位ベクトルを手に入れます。次に反射ベクトルを作った後に、反射ベクトルや法線ベクトルと光源ベクトルの内積を計算して、光源計算に必要な量を手に入れます。最後にそれぞれの色の強さを光の強度に掛けて、最終的な色を算出します。特徴としては、鏡面反射色を黄色にしているのですが、飽和させて白い色を作り出しています。使えば、ほうわした部分にフレアを掛けてより面白い効果が狙えると思います。■最後に今回のプログラムはほおって置くと、どんどん波が減っていきます。そこら辺を解消しないと現実には使えませんね。フレネル効果を入れていないのですが、縦に伸びる光の筋が観察できます。波を作るプログラムや法線を作るプログラムには、より効率の良いアルゴリズムがありますが、とりあえず基本として...もどるimagire@gmail.com。