真・東方縦画面化ツールに搭載した拡大フィルタについて補足しておきます。
以前のアス比固定拡大ツール等ではバイキュービック等の高度なフィルタは後から追加するプラグイン式でしたが、今回は最初から組み込まれていて簡単に切り替えができるようになっています。ゲーム中に切り替えも可能なので、画質や負荷の比較も容易になっています。
今回搭載したフィルタは次の5つです。
- バイリニア
- Bスプライン
- バイキュービック(簡易版)
- バイキュービック(修正版)
- Lanczos2
バイリニアのみピクセルシェーダを使用していません。Bスプラインとバイキュービック(簡易版)はピクセルシェーダ2.0以上で、バイキュービック(修正版)とLanczos2はピクセルシェーダ3.0以上で動きます。基本的に上記リストで下にいくほど重いフィルタになります。
バイリニアは、シャープネス0のときにバイリニアフィルタ、シャープネス1のときにポイントフィルタ(いわゆるフィルタ無し)、中間ではその両者を混合した画像になります。シャープネスが0または1のときは混合処理をスキップするので、少しでも軽くしたい場合は0か1にすると良いと思います。
Bスプラインは16点から補間する手法ですが、フィルタの性質上少しボケた画像になります。バイキュービックよりも軽いフィルタが作れそうなので作ってみたのですが、バイキュービック(簡易版)との差はあまり無いようです。なお、このフィルタでは、シャープネスの調整はできません。
バイキュービック(簡易版)は、本来は16点補間のバイキュービックから、影響が少ない四隅の4点を省略して12点補間にしています。バイリニアよりもくっきりした画像になりますが、シャープネスを上げるとリンギング(色が急激に変化する部分の周りにできるノイズ)が発生します。
バイキュービック(修正版)は、16点補間の真のバイキュービックフィルタに、リンギングの発生を抑える処理を加えています。この処理を加えたことで、次のLanczos2との差はあまり無くなったと思います。バイキュービック(簡易版)とはシャープネスが1に近づくほど差が出てきます。
Lanczos2は、バイキュービックよりも画質が良いと言われるフィルタで、ボケが少ないわりにリンギングが控え目の傾向になります。ただし、バイキュービック(修正版)の3倍以上の命令数と、かなり重いフィルタになっています。また、シャープネスの調整ができません。
ピクセルシェーダ2.0で使えるフィルタでも、3.0が使用可能な環境では自動的に3.0バージョンを使用するようになっています。
各シェーダの重さの目安となる命令数は次のようになっています。
| PS2.0版 | PS3.0版 | |
| バイリニア | - | - |
| Bスプライン | 52 | 41 |
| バイキュービック(簡易版) | 58 | 52 |
| バイキュービック(修正版) | - | 73 |
| Lanczos2 | - | 233 |
Lanczos2の命令数がかなり多いですが、GeForce9600GTで東方ならばこの程度は屁でもないです。
ちなみにGeForce9600GTで各フィルタの負荷を比べてみたところ、Bスプライン≦バイリニア≒バイキュービック(簡易版)<バイキュービック(修正版)≒Lanczos2、という傾向でした。
最近のGPUでは昔ながらの固定機能は実装していなくて、内部的にはシェーダを使用したエミュレーションになっているので、固定機能を使ったバイリニアが意外と遅いみたいです。バイリニアフィルタ自体はテクスチャユニットが標準的に装備しているフィルタで、このツールで使用している処理をピクセルシェーダで実装すると4命令程度で済むので、これもシェーダにした方が軽いかもしれませんね。
バイキュービック(修正版)とLanczos2は、どちらもテクスチャ参照回数が16回になっています。命令数が3倍も違うのに負荷が大して変わらないのは、テクスチャアクセスがボトルネックになっているようです。