その中で、「GPUに向かない画像処理」として、「サーフェス色の任意色の座標値の所得」をあげられていました。個人的には、特定の色の中心を求めるのはGPUがやっても差し支えないと思います。いうことで、テストプログラムを書いてみました。いつものようにプログラムです。2_0])左ドラッグで白い線を描きます。その中心を赤いターゲットが指します。ソースには、いつものように適当にファイルが入っています。大事なファイルは次のものです。シェーダプログラム■何をやっているの?さて、重心を求めます。wiに書き直すことができます。wiは、0と1だけではなく、その中間でもよく、その場合には、画素が有効度合いのような意味が付くでしょう。関して全画素の合計をとり、その結果を割るといった処理になっています。いっても、実際には合計をとる処理に関して一様なスケーリングをしても結果が変わらないので、「合計」をとるのでも、「平均」をとるのでもその結果はかわらないということになります。全画素の平均を取るというのは、いわゆるブラーを最後までとることです。これはミップマップとしてCGでよく知られている方法で処理できます。wiを計算し、それらの平均をミップマップをすることによってもとめ、最後にその結果を割ると欲しい重心が求まります。今回のプログラムでは、r及びg成分にwixiを、a成分にwiを格納して計算します。wiは、重心を取りたい元画像の白黒の濃度に他なりません。■元画像を使った各テクセルのxy座標の埋め込み最初のステップは、基画像に座標値を掛けて、ピクセルごとに合成する基の数値を導出することです。座標値は、左上が(0,0)、右下が(1,1)になるように、射影空間の座標値をスケーリングします。}アプリケーションプログラム側では、基画像のテクスチャを読み込みテクスチャとして、ポリゴンを全画面で描画します。ちなみに、バイリニア補間を効かせるために、1テクセルだけ座標値をずらして描画します。);■ブラーミップマップの計算は、16ボックスサンプリングで行いました。精度の問題で、縮小バッファに浮動小数点バッファを使いました。RADEON9600では浮動小数点バッファにバイリニア補間が使えないので1回のサンプリングで16テクセルの情報しか拾えません。16ボックスサンプリングで64テクセルの情報を拾うこともできるでしょう。}アプリケーションプログラム側では、レンダリングターゲットを変えてポリゴンを全画面に表示します。最後に、1テクセルまで落とした情報から平均の座標値を求めて、w成分(有効なテクセル数)で割ることによって、重心を計算します。ターゲットを動かすのに、表示するターゲットのテクスチャ座標をずらす方法を採用しました。この方法では、ターゲットを表示するために、全画面のポリゴンを表示する必要があります。他の方法を採用するぐらいなら、この方法のほうが速いと感じたので、この方法を採用しました。今回は、ターゲットの大きさが32ピクセルで、画面の大きさは512ピクセルにしました。この場合には、テクスチャ座表が512/32=16のときにターゲットは画面の端に行きます。位置座標に512/32倍しているのは、0~1の範囲で動くターゲットを画面の大きさに調整するスケーリングのためです。}アプリケーション側では、ターゲットの中心が原点(左上)になるように調整して、全画面にポリゴンを表示します。}■CPUで重心を使うときには?さて、今回の結果をCPUで使いたいときですが、1x1テクセルまで落としたテクスチャをロックして読み込めばよいということになります。その方法にはペナルティが付くので、1x1のテクスチャは複数用意してバッファリングすべきでしょう。リアルタイムで結果を反映させなければならないところは、今回のターゲットの表示部分のように処理すれば問題ないですね。いうことで、平均操作ぐらいは、もはやGPUで処理してもいいのではないかと思います。■最後に今回のネタは、ShaderX2の焼き直しだし、新しいことはなにもないね。もどるimagire@gmail.com。