~■はじめにATIのネットセミナーで紹介されていた、2パスを使ったガウス型のブラーフィルタです。今回のプログラムは、15タップ30ピクセルのサンプリングと、ATIのものよりもサンプリング数が増えていることが特徴でしょうか(というか、なんでATIは少ないの?)。(ガウスフィルタ:DirectX9)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースmap.bmp:デカールテクスチャあと、実行ファイル、モデル及び、プロジェクトファイルが入っています。■ガウスフィルタとはガウスフィルタとは、ガウス関数を使ったぼかしフィルタです。ガウス関数とは、指数関数的な形をした関数で、次の形をしています。2σ2Nは規格化変数で、σ2は分散です。2σ2で、例えば、分散σ2=52の規格化定数Nを除いたグラフは、次のようになります。分散σ2は、おおよそのグラフの幅をあらわし、x=σの場所で、exp(-0.5)=0.6065になります。分散が大きければ大きいほど関数の山は緩やかになり、逆に小さくなれば、鋭い針のような形になります。ガウス関数をフィルタリングに使うというのは、ピクセルを合成する時の重みを中心のピクセルからの距離に応じてガウス関数で決定するということです。2σ2の公式にしたがって、ピクセルが合成されます。ガウス関数による合成の特徴の1つは、2パスにきれいに処理を分離できることです。式をよく見て分解すると、x軸方向と、y軸方向の和にきれいに分けることができます。2σ2この式があるので、最初にx軸方向のサンプリングを行ってから、y軸方向のサンプリングを別に行うという方法が正当化されます。ひとつの特徴は、円形にサンプリングできるということです。2σ2になり、重みの式自体には、角度θの係数が入らないので、中心のピクセルから同じ距離にあるピクセルは同じ重みで合成されます逆の視点で見れば、一つの点がサンプリングされる時に、等しい距離にあるピクセルは同じ重みでサンプリングするので、ピクセルの色は円形に広がることになります。このような関数は、重みをrの関数にすれば可能ですが、2パスにきれいに分けられる関数は少ないと思うので、ガウス関数は有用な関数の1つであると断定することができます。具体的にグラフを見ても、重みが円形に広がっているのが確認できるでしょう。■プログラムでは、プログラムを見ていきましょう。頂点シェーダプログラムを最初に見ましょう。最初は、x軸方向にぼかしをかけます基本的には、中心のテクセル座標をピクセルシェーダに送るだけです。そのときに、y軸を0.5テクセルだけ下げました。張るときに注意すれば、ずらさないほうが、よりぼけるのでいいかもしれません。}ピクセルシェーダでいよいよサンプリングです。今回は、テクセル中心をちょうどテクセルの真ん中にする位置でサンプリングしました。15回のサンプリングで、30テクセルのサンプリングをします。ガウス関数の重みは定数配列weightとして与えます。ちなみに、符号が異なる同じ距離にあるテクセルは同じ重みの値が使えるので、定数は8つ用意すれば事足ります。}y軸方向のぼかしは、同じ定数を使って、ずらす方向をx軸からy軸に変更するだけです。}ちなみに、重みの計算ですが、アプリケーション側で初期化時や設定が変更されたときにしています。m_tbl[i]にそれぞれの重みをガウス関数から計算し、最後に規格化定数で割って正規化します。重みは、中央の1つだけが2テクセルのサンプリングに使われ、他は4テクセルのサンプリングをするので、規格化のための係数の重みを考えなくてはなりません。}■ついでにフレア今回のフィルタを使って、擬似フレアエフェクトを作成しました。フレアの大きさを大きくするために、4分の1の縮小バッファに明るい部分を抽出してぼかしました。使ってよいのかわからない重さですね。「私が今使った感じでは、ガウスフィルタ自体は特に重くなっていませんね。」いわれてしまったので、高速化してみました。前回80FPS程度だったものが、今回は120FPS程度になりました。中心のタップもずらして2つ読むようにしています。ほとんどわかりませんが、よりぼけているはずです。プログラムの高速化ですが、ピクセルシェーダプログラムを頂点シェーダやアプリケーションのプログラムに押し込む形で進めていきました。ps.2.0では、8つのテクスチャ座標を渡せるので、片方のテクスチャ座標を渡します。}ピクセルシェーダでは、頂点シェーダから入力されたテクセル座標と、定数を足しこんで求めた反対側からのテクセル座標からサンプリングして重みを掛け合わせて足し込みます。テクスチャ座標をずらす定数は、テクスチャの広さから求まるのですが、命令数を減らすために、ピクセルシェーダで計算しないで、アプリケーション側から設定して、命令数を稼ぎました。定数を足してテクスチャ座標をずらしたので、外側にあったピクセルは内側に移動したことに注意してください。}これぐらいの高速化では、やっぱり重いと感じてしまう・・・ガウスフィルタかけないと400FPSになっているので、使うときは縮小バッファを使わなくては駄目ではないでしょうか。もどるimagire@gmail.com。