- テキストレンダリングの品質問題、特にSDF(距離場)ベース方式の限界を解決するため、新しいリアルタイムベクターレンダリング手法を提案
- グリフ(文字)をベクター曲線の形でGPUに直接送信し、リアルタイムでラスタライズすることで、無制限の解像度と少ないメモリ使用量を実現
- テクスチャアトラスおよび時間的蓄積(temporal accumulation)手法を活用し、高いアンチエイリアシング品質と効率的なキャッシュを実現
- さまざまなサブピクセル構造(例:OLED、LCDなど)にも最適化して適用でき、フリンジング(色にじみ)の問題なく滑らかで鮮明な結果を提供
- リアルタイムテキスト、UI、ゲームなどにおける高品質なフォントレンダリングのための、シンプルで拡張性の高いアプローチを提示
はじめに: テキストレンダリングの課題
- リアルタイムテキストレンダリングでは、エイリアシング(ジャギー)、大型テクスチャ、ビルド時間、拡大・縮小、滑らかな移動など、さまざまな問題が存在
- 従来よく使われるMulti-Channel Signed Distance Fields(SDFs)方式には、品質および柔軟性の面で限界があった
- 近年のOLEDモニターにおける非標準サブピクセル構造とフリンジング問題をきっかけに、サブピクセルアンチエイリアシングまで考慮した新しいアプローチを開発
既存のSDF方式の限界
品質
- SDF方式では、細かなディテールや細いストロークが多いフォントで、品質低下や情報損失の問題が発生
- 解像度を上げない限り、特定のグリフでアーティファクトが残る
アトラスサイズ
- SDFは最初にオフラインで生成してアトラスを保存するため、多数のグリフやCJK(中国語、日本語、韓国語)フォントでは現実的でないほど巨大になる
- 複数フォントを同時に使う場合、メモリ消費とストリーミング帯域の負担が大きくなる
柔軟性と単純さ
- SDFという中間段階を経由するため、ソースデータから最終結果までの全体フローが複雑になる
- リアルタイムあるいは動的なベクター画像を直接活用したり編集したりするには制約が大きい
新方式: ベクター曲線のリアルタイムラスタライズ
- テクスチャを事前生成する代わりに、画面に実際に表示されるグリフのベクター曲線データ(ベジエ曲線など)を直接GPUへ送信し、その場でラスタライズ
- アトラステクスチャには必要な分だけグリフを入れ、使用頻度に応じて保持または解放
- グリフが画面上に残っている間、サンプルの蓄積(temporal accumulation)によって非常に高品質でより滑らかな(アンチエイリアスされた)結果を実現
- 常にベクターベースで処理するため、解像度の制限なく鮮明な結果を提供
フォント曲線データの処理
- FreeTypeなどのオープンソースライブラリでさまざまなフォントフォーマットを読み込み、グリフの曲線情報を抽出
- グリフをライン、2次/3次ベジエ曲線として解析し、すべての曲線を2次ベジエ曲線に変換してGPUシェーダーでの処理を単純化
- ラインは中間制御点を追加して2次曲線に変換
- 3次曲線は2つに分割した2次曲線に変換
カバレッジ(ピクセル内部の塗り)計算
- 各ピクセルごとに水平方向(ray)への曲線との交点を計算し、winding number(累積交差数)によって内側/外側を判定
- **数百回のサンプル(n回の累積サンプル)**を合算し、一部の微小な誤差は最終結果にほとんど影響しない
- **サンプルポイント配置(quasirandom sequence)**手法により、各フレームで異なる位置から結果を蓄積
曲線アクセスの最適化
- グリフを水平バンド(band)単位に分割し、バンドごとに関連する曲線だけをテストして計算量を削減
- スレッド配置とバンド単位の反復によって、GPUでのバルク演算効率を最大化
アトラスのパッキングと管理
- アトラス(共有テクスチャ)に各グリフ画像を割り当てて管理
- 存在しないグリフは新たに領域を割り当ててラスタライズし、すでにあるグリフは再利用
- 参考までに、同じグリフでもサブピクセル位置やサイズによって異なるバージョンが必要になる場合がある
- Z-Order Packing(Morton codeなど)により、1次元ビットセットと2D空間の間で効率的なパッキングを実装
- ラテン系は縦基準、アラビア語系は横基準など、言語構造ごとに柔軟な応用が可能
- グリフが不要になれば、アトラス空間を再割り当てして使用
時間的蓄積(Temporal Accumulation)
- グリフキャッシュとサンプル蓄積方式により、表示直後は素早く高品質サンプルを確保し、その後のフレームでさらに精密に補正
- 最初のフレームは8サンプル/ピクセル、その後は徐々にサンプル数を減らし、最大512回まで蓄積
- 滑らかなグリフ表示とリソース最適化を両立
サブピクセルアンチエイリアシングとフリンジング(Fringing)防止
- サブピクセル(RGBなど各素子をサンプルとみなす)単位でレンダリング領域を配分し、水平方向の解像度向上効果を実現
- LCD標準構造、OLED/WOLEDなど多様な配列に対応
- フリンジング(色にじみ)のない滑らかな効果を指定可能
- サブピクセルサンプルが重なる(Overlapping)ように配置することで、実際のモニターの光の混合効果まで反映
- ピクセル境界やヒンティング(hinting)がなくても、自然で鮮明な出力が可能
ディスプレイごとのサブピクセル構造への対応の重要性
- モニターのサブピクセル配列情報をプログラムから確認できるなら、はるかに精密なレンダリングが可能
- これはハードウェアの限界ではなく、ソフトウェア処理の問題であることを強調
まとめと活用の展望
- 優れたテキストレンダリングが全体の使いやすさやサービス品質に与える影響は大きい
- 特にUI/ゲームなどでは、高品質なフォント表現が製品体験に大きな違いをもたらし得る
- シンプルさ・拡張性・高品質・柔軟性という原則を実現できる作業構造
- オープンソース実装、多様なサブピクセル対応など、実際の産業/プロダクション利用に非常に適している
1件のコメント
Hacker Newsのコメント