描画に関係しないシステム的な部分。変更が無いので、出番無し。頂点ブレンドのブレンドファクターの計算もする。ロードのインターフェイス。(空デカール)あと、モデルと、実行ファイル及び、プロジェクトファイルが入っています。■基本方針シャドーバッファは、まず被写界深度のときのように(光源方向から見た)深度をテクスチャーとして保存します。深度を比較するときは、深度テクスチャーを作ったときのスクリーン座標にテクスチャー座標をあわせます。スクリーン座標をテクスチャー座標にして、そのままテクスチャーを張った場合、が、得られます。この値と現在の頂点のライト方向からの深度の差分をとれば、影となる部分が判明します。影となる部分を、元になる絵から、減算すれば、影が求まります。ここで、見える絵はマッハバンドでまくりですが、これはPNG8で画像を圧縮したためで、実際はもう少し解像度高いです。■全体の流れさて、描画部分を説明しましょう。最初は、レンダリングするターゲットをテクスチャーにして描画します。次に、レンダリングターゲットを通常に戻して、シェーダーとビュー行列を変えて描画します。テクスチャーとして、レンダリングしたテクスチャーも指定します。2度目の描画のときは、一度目のライト方向からのビュー座標をシェーダーのパラメータとして、引き渡します。}■一度目のレンダリング深度テクスチャーの作成部分ですが、頂点シェーダ―は被写界深度のときと同じように、頂点色のアルファ部分に深度を入れます。v7ピクセルシェーダーは色の部分にテクスチャーを合成していますが、実際にはアルファ部分だけ頂点色を出力すればOKです。光源方向からの座法変換した結果を代入していることです。そのときに同次座標のw=1平面への射影をするのを忘れないようにしましょう。0.5)になるように調整をする必要もあります。あと、比較用に、1パス目と同じように、深度値をアルファ成分に入れています。命令を使って、元の色から減算する量を決定します。大小比較するときに、0.1(=c0.w)だけ引きました。この値を引かないと、バッファの値と深度が同じ時に、座標が完全には一致しないための深度判定のミスが起こり、縞模様が発生してしまいます。ゲームなどを良く見ると、影が少し浮く現象が見られます(シャドウマップの時は、1パスを使ったり、完全に座標を一致させて描画するなどの解決する方法がありますが、今回の方法に関しては、それは使えません)。■問題点この方法に関して、よく知られた欠点があります。それは、シャドーバッファの精度が低いということです。テクスチャーの面積が広くないと汚くなることが知られています。その影響はオフセットの大きさに現れますし(原理的には精度が無限なら深度が非常に近い部分での縞模様は出ない)。影の縁の部分が点々として汚くなることでわかります。深刻な現象も現れていて、画面の右側(光の方向の反対側)の一部の影が消えてしまいます。これは、奥の部分で色が飽和してしまい、遠近の判断が正常に処理されていないためです。現実に使うためには、「手前」と、「奥」の範囲を慎重に決めなければなりません。オフセットをかましている分、途中から影が発生するのと同時に、境界部分が汚くなっています。これも、シャドウバッファの精度を高くするとともに、テクスチャーの面積を広くする必要が出てきます。D3DFMT_A32ってありませんかねぇ。比較演算も使えるようにして。あと、原理的な問題として、ふちの形がくっきりして、半影が表現できないです。話にでたので、こちらをやりました。実は、シャドーボリュームがうまくいかなかったので、ほってあるんですよね。個人的には「ステンシルバッファはなくなる。アルファでやろうとしたら、塗りつぶしがうまくいかなかったんだなこりゃ。あぁ、でもシャドーボリュームもやらなきゃ。ここでの「ステンシルバッファはなくなる。」というのは、勝手な妄想で根拠のあることではありません。最終的には汎用的な「バッファ」に統一されて、プログラマブルに制御するようになるのではないかと想像しています。もどるimagire@gmail.com。