Green氏がGDC2003で発表された(らしい。Table(SAT)を実装してみました。(範囲総和テーブル:DirectX9)まぁ、いつものように適当にファイルが入っています。出力されるフレームワークのファイルは紹介を省かせていただきます。アプリケーションのソースあと、実行ファイル、モデル及び、プロジェクトファイルが入っています。Hardware」です。Crowが考案した積分計算したテクスチャを用いたフィルタリングの方法です。値が1の元のテクスチャからSATを作って見ましょう。最初に、横方向に現在のピクセルの色に、そのピクセルの左にあるピクセルの合計を足します。この手順で、ピクセルの値は、そのピクセルのU座標の値になります。次に、縦方向に現在のピクセルの値に、そのピクセルの上のピクセルの合計を足します。この結果、ピクセルの値は、そのピクセルのU座標*V座標になります。この値は、x軸とy軸に関して対称なので、実は縦方向と横方向の合成の順番を入れ替えても結果は変わりません。32x32の大きさのSATは次のようになります(ただし、(赤、緑、青)=(3,2,1)の割合で色をつけています)。このテクスチャを使った計算に、次の等式が成り立ちます。V]の範囲の面積が成り立ちます。次に、元のテクスチャの値がtUVで与えられる場合を考えて見ましょう。この値は、選択した範囲の合計なので、範囲の面積で割ると、範囲の平均値が求められます。V]のテクスチャの平均と、書くことができます。一度SATを求めてしまえば、4点をサンプリングするだけで、箱型の平均を取ることができます。(a,b)の値は自由に取れるので、ぼかす量をピクセル単位に自由に調整することも簡単にできます。■範囲総和テーブルの作成SATは、浮動小数点数バッファが使えるようになって初めて実現できた手法です。フォーマットの一番贅沢なD3DFMT_A32B32G32R32Fです。FXでどのような結果が得られるのかはわかりませんが(缶持ってる人ためして~))。いうことで、最初にするのは、レンダリングターゲットを確保することです。浮動小数点数のレンダリングターゲットを作成します。E_FAIL;描画の最初の手順は元になる画像を作成することです。基本的には、環境マップ作成時のように、レンダリングターゲットを切り替えて、普通に描画します。m_pd3dDevice->EndScene();さて、いよいよSTAの作成です。隣のピクセルを加算することで、その左にあるピクセルの合計を計算しました。y方向のぼかしには、横線を同じように引きます。基本的には、前の線の描画の完了を待たなくてはいけないので、BeginScene/EndSceneで描画の終了を待ちます。いちいち頂点情報を作成していますが、頂点バッファを用意しておいて描画すると早くなるかもしれませんね。m_pEffect->End();頂点シェーダでは、頂点位置のテクセルと、1つとなりのテクセルをテクスチャ座標として指定して出力します。テクセル中心をテクスチャ座標にきちんと合わせて出力します。それぞれのテクセルを読み出します。今回のプログラムでは、誤差を減らすように、色の値0.5を中心に上下に平等に値が変化するようにしました。}y軸方向のぼかしの場合には、ずらす位置を変えるように頂点シェーダを変更します。頂点データを元から持っておけば、シェーダを切り替えることなく(固定機能も使えるでしょう)実行することもできるでしょう。}この工程の結果、SATは、次のような画像になります(浮動小数点数バッファの値をそのまま出力しているので、値が1より大きな部分は飽和しています)。■範囲総和テーブルを使ったぼかしSATができたら、それを使ってぼかした画像を使います。基本的には、レンダリングターゲットをフレームバッファに戻してから、四角形を描画するだけです。}今回は、40x40テクセル分をぼかして出力します。頂点シェーダでは、テクセルの上下左右の隅のテクセルを指定します。サンプリングした範囲の面積で結果を割ります。最後に、差っぴいた0.5の分を加えるのを忘れないようにしましょう。}■最後にさすがに何度もBeginScene/EndSceneしてるので、重いですね。重いと思っていたガウスフィルタよりも重たいです...でも、積分計算してると思えばバク速の範囲でしょうか。今回のプログラムは、不動小数点数バッファを使いますが、シェーダ自体はvs_1_1、ps_1_1で可能になっています。結局はポストエフェクトなので、描画順序に依存するような処理に使うのは難しそうですね。いうことで、アンチエイリアスに使うのは難しい気がしますが...もどるimagire@gmail.com。