描画に関係しないシステム的な部分。ロードのインターフェイス。(ライトテクスチャー)あと、モデルのファイル、実行ファイル及び、プロジェクトファイルが入っています。シャドウマップ」というタイトルで、このサンプルがGeForceFXで動作しないという報告があがっていました。GeForce3,4から、DirectX8で未定義だった部分に関して変更が図られています。テクスチャ参照(HLSLのtex2D)」に変更されました。言って、射影テクスチャ参照だけあれば十分だったので、この変更はいたいところです。r0.wに変更する必要があります。影の生成部分では問題が無いのですが、ライトテクスチャのサンプリングでは、射影計算を行ってからピクセル単位の補間を行うので、この計算では誤差が生じてしまいます。言って、射影テクスチャ参照だけあれば十分だったので、この変更はいたいところです。他にも、テクスチャにNULLが設定されていたときのサンプリング結果が、0から1に変更されていました。今回は、テクスチャしかない場合と、頂点色しかない場合でピクセルシェーダプログラムをきちんと分けて、推奨されるプログラムに変更しました。9では、行列に掛けるバイアスに関してビット深度分のスケーリングをしなくてよくなったようです。1;に変更してください。今回の変更でも、シャドウバッファのClearが数十回に1回しか行われないなどの、不十分な変更になっています。9世代では、別の方法を考察したほうがよいかもしれません。さん、非常に参考になりました。HWシャドウマップをサポートしているかチェックしましょう。深度バッファをテクスチャーとして使えるかチェックします。テクスチャーを生成します。色成分のテクスチャーと深度のテクスチャーの2つを作る必要があります。深度のフォーマットを使って作成します。レンダリングする時は、サーフェスを指定する必要があるので、同時にサーフェスも生成します。あと、ライトのテクスチャーもロードします(この部分はnVIDIAのサンプルの丸写しがばればれですな)。初期化時に設定しましょう。それぞれのテクスチャーの拡大縮小フィルターを双線形にします。影マップの時には、このフィルターを切って最近接テクセルの色にすると、影ががたがたした色になります。範囲を飛び出たテクセルに関して最外テクセルの色を使うようにしないと遠くのテクスチャーに関する結果がおかしなものになります。D3DTEXF_NONE);では、描画部分です。レンダリング対象をテクスチャーに指定します。深度部分は、今回の肝である深度に関するテクスチャーのサーフェスを指定します。次にビューポートを変更します。今回は、描画するビューポートとテクスチャーの解像度が同じなので、設定しなくても良いですが、いつもこんな状況ではないので、指定しておきましょう。その後、色成分の書き込みを禁止します。深度テクスチャーだけが必要になります。レンダリングする量を減らすために、深度だけを更新して速度を稼ぎます。命令で深度を初期化します。その後、シェーダーを設定してモデルを描画します。2パス目は、1パス目で作成した影マップをテクスチャーに指定します。ライトのテクスチャーも指定します。}■モデル描画モデルの描画部分を見てみましょう。i;カメラからの行列が必要です。これは、いつものものです。mProj;ライトからの行列も作ります。mProjL;次に、テクスチャー座標系に関する変換行列を用意します。射影空間が中心原点なので、左上を中心とするテクスチャー空間に変換するために挿入します。深度に関しては、0から2深度バッファの解像度-1がテクスチャー空間の範囲になります。射影空間では0~1が深度の範囲なので拡大して範囲をあわせます。オフセットもここで追加します。ところで気づいたのですが、逆カリングを使うときは、物体のライトから裏のポリゴンに関して影の境界があります。その部分の影がちらついてしまいます。従って、オフセットを裏の部分がちらつかないように調整しなくてはなりません。mScaleBias;次に、逆カリングの設定をします。}いよいよモデルの描画です。ワールド行列を作ります。mWorld;次に、影マップか、バックバッファへの描画かによって、変換する行列を切り替えます。バックバッファへの描画かのときは、ライトからのテクスチャー座標への変換行列も設定します。1);モデルを描画します。■シェーダーさて、合成するときのシェーダーです。合成方法を見ましょう。頂点色とデカールテクスチャーの色を加算で合成します。影マップは、深度テストに合格したピクセルが白くレンダリングされます。テクセルサンプリングするときに双線形フィルタでサンプリングするようですね。この結果に対して、定数を足してます。影になる部分が完全に黒にはならないで、薄暗くなります。モデルの色と影の結果を乗算して、影マップによる影をつけます。次にライト方向からテクスチャー座標を算出したライトのテクスチャーの色と今の結果を掛け、最終的な結果を得ます。モデルの色をつけたほうが、影が重なったところが真っ黒にならなくて良いですね。ピクセルシェーダーでは、今言ったことを計算します。頂点シェーダーでは、ピクセルシェーダーに送るテクスチャー座標などを設定します。座標変換や、頂点色は普通の計算です。テクスチャーは、デカールはモデルに設定されたテクスチャー座標を出力します。影マップと、ライトのテクスチャーは頂点座標を透視変換して、出力します。影マップのテクスチャーには、4次元ベクトルを出力する必要があります。出力した深度値と、深度テクスチャーに保存された値とを比較して、描こうとするピクセルの深度がテクスチャーの値よりも小さいときに白色を出力します。実は、ライトのテクスチャーには必要ないです(x、y、wの3つの座標値に関して出力すれば十分です)。命令数を少なくしたい方は、展開してz成分に関する出力を無くしてください。■最後にやっぱり24bitsあると綺麗ですね。専用というのがどうも...将来、テクスチャーのフォーマットが浮動小数点数を扱えるようになったら、いらなくなるんでしょうね。もどるimagire@gmail.com。