描画に関係しないシステム的な部分。ロードのインターフェイス。(空デカール)あと、実行ファイル及び、プロジェクトファイルが入っています。エッジが抽出できないので、深度に関するエッジも取る必要があることがよく知られています。最近のプログラマブルシェーダーの力はそれらの処理を楽勝で行えます。やってやるのかという話になります。最初に、法線マップによるエッジを抽出します。1パス使って、法線マップのテクスチャーを作ります。2パス目で、フレームバッファに法線マップのエッジを作成します。次のパスでは、法線マップのことはすっかり忘れます。3パス目で、テクスチャーに通常のレンダリングと、アルファ成分に深度情報を埋め込みます。4パス目で、深度エッジを作成し、テクスチャーの色と積算して合成します。(前のスクリーン全体に関するエッジフィルターを深度値で行った様にです)。最後に、フレームバッファへの合成時のアルファ合成を使って、乗算合成で深度エッジと乗算し、最終的なエッジを得ます。■シェーダープログラムさて、どのようにして、以上の手続きを実現するか、ピクセルシェーダーのプログラムを見てみましょう。最初は法線マップの作成です。計算をして色に出力します。ピクセルシェーダーでは、色をそのまま出力します。v0法線エッジの抽出は、テクスチャー座標を微妙にずらした4枚のテクスチャーを用意します。ピクセルシェーダーで対角的な差分を各色成分ごと取り、成分の2乗和をとって、適当に倍数を掛けます。4(1-64(|t3-t0|^2+|t2-t1|^2))次は、深度マップの作り方です。今回は、「手前の解像度が相対的に大事」ということで、手前の分解能を上げる変換を使いました(いわゆる視点からの相対深度)。(Zfar-Znear)後は、普通にディフューズの計算です。ピクセルシェーダーでは、色成分とアルファ成分を合成する「+」を使って、ちょっとだけ高速化を考えています。v0深度エッジは、法線エッジを求める時とほとんど変わりません。違いは、テクスチャーのアルファ成分の差分を計算して、最後に、エッジの結果と色を掛け合わせることです。r0のエッジに色を乗せる■cソース呼び出しているcプログラムですが、ほとんど同じループが2回繰り返されています(手を抜いてコピー&ペーストしたってばらしちゃ駄目です)。この設定によって、最終的に法線エッジとそれ以外の深度エッジと通常のレンダリングの結果を合成します。一年ぐらいでずいぶん進化しましたね。このペースで進化しつづけるとすると、本当に映画のクオリティがリアルタイムにできるようになりそうです。掲示板で、新坂さんから、「マテリアル境界に線を引くのは必須ですね」言われました。「デプス、法線、マテリアルIDの3つの中で単体で一番まともに使えるのがマテリアルIDを使った方法だと思います。」と、豪語されてしまいました。やらないわけには行かないじゃないですか。いっても、今回の画像では、エッジを引かれた部分の色が濃いのでエッジが目立ちませんね。(深度法線エッジによる輪郭抽出のサンプル:DirectX8.1)ファイル構成は同じです。法線マップ生成頂点シェーダー。法線マップ生成ピクセルシェーダー。法線マップのエッジ生成頂点シェーダー。法線マップのエッジ生成ピクセルシェーダー。深度、通常色の頂点シェーダー。深度、通常色のピクセルシェーダー。深度エッジの頂点シェーダー。深度エッジのピクセルシェーダー。