GPUを用いたテキスト描画品質の追求
炊紙というテキストエディタにおける文字列描画アルゴリズムについて手短に説明する。
要旨
炊紙では Evan Wallace のアルゴリズム(以下既存手法とする)を用いて GPU でフォントをレンダリングする。しかし、既存手法ではアンチエイリアシングはスーパーサンプリングによって行う事になる。スーパサンプリングは、ピクセル毎に求める品質までピクセルを分割して計算することになる。このため、品質要求の高まりに応じて指数的に GPU 負荷が上昇する。 本記事では解析的アンチエイリアシングを行う事によって、品質に応じて指数的に負荷が上昇する問題を解決する。
Easy Scalable Text Rendering on the GPU
本手法
既存手法では、全てのグリフは直線と二次ベジエ曲線に近似して描画する。直線と二次ベジエ曲線のアンチエイリアシングは描画領域となる三角形内とその近傍での SDF (符号付きフィールド)をフラグメントシェーダーで求めることでも実現可能である。
三角形だけでなくその近傍も描画対象にすることで、より品質の高いアンチエイリアシングを得ることができる。これは描画対象となる三角形よりも1ピクセル外側には、ピクセル中心は通らなくてもエッジが含まれるケースがあるためだ。
1ピクセル分外側をフラグメントシェーダーの計算対象にするには Conservative Rasterization(保守的なラスタライズ)という GPU の機能を用いることで実現できる。
ただし、Thin Triangle(細長い三角形)は Conservative Rasterization を用いても本来アンチエイリアスの描画対象となるピクセルをフラグメントシェーダーの処理対象にできないケースがある。この問題については現状未解決の課題である。