GPU を利用したテキストレンダリング

というわけでしらいさんの「フランス未来エンタメ研究所」より.

でもローカライズにおけるフォント問題とかはずいぶん前からの話題だよな…。Vistaでは日本語フォントも頂点で持つわけですが、この辺の問題は片付いたのかな…?

日本語表示については色々思い出があります.Direct3D でターミナルエミュレータを作っていたときに,2048×2048のテクスチャに6千字以上詰め込んでみたりしたのがちょうど4年半ぐらい前の話.当時の日記を漁ったら画像が出てきました.
『MS ゴシック』12pt
とまあ今までのDirectXはゲームに特化ということで文字描画についても自前でがんばれという話だったのが,Windows Vista では高速低コストな文字描画もフィーチャとして想定されています.「アクセラレータカード再び」という感じですな.
GPU を利用したテキストレンダリングのアルゴリズムについては WinHEC 2004 の資料が詳しいです.さすがに今更ベクタフォントの展開をハードウェアにやらせようというわけではなくて,1bpp のサーフェイスで VRAM 消費をけちりつつ,アンチエイリアスのためにカスタムコンボリューションフィルタを設定可能にしたらどうでしょね? というのが落としどころな模様.これだと上の 2048×2048 のフォントキャッシュも 512KB におさまります.
http://download.microsoft.com/download/1/8/f/18f8cee2-0b64-41f2-893d-a6f2295b40c8/TW04007_WINHEC2004.ppt
DirectX7 世代のカードでも最終段の ClearType のところがアクセラレーションされるとなっているのは,D3DRS_COLORWRITEENABLE を使って実装するみたいですね.最近の DirectX SDK に付属する CardCaps.pdf では G450 や Wildcat VP870 などが D3DRS_COLORWRITEENABLE 非サポートとなっていますが,この辺のカードはちょっと苦しいかもねと.
また資料には実効性能の予想値が出ています.

  • DirectX9-class ― 125k glyphs per second
  • DirectX10-class ― 1M glyphs per second

実際はこの後色々あって,DirectX10 世代で導入とされていた 1bpp surface とカスタムコンボリューションフィルタの実装は DirectX9.L に前倒しされました.従って,Windows Vista リリース時から対応ハードウェアであればテキストレンダリング時に使用されるものと予想されます.

まあもはやゲームの場合はただのテキスト描画がネックになるということはあまりなさそうですが,1bpp surface + ConvolutionMonoKernel のエフェクトへの応用は案外と面白いかもしれません.自由にスケーリング可能な文字描画の実装もそろそろ持っておきたいですね.