概要
リアルタイムテキストレンダリングの課題と進化を解説。 SDF方式の限界と新たなサブピクセルアンチエイリアス手法の導入。 フォント曲線データをGPUで動的にラスタライズするアプローチ。 高品質・低メモリ・高柔軟性を実現するパイプラインの概要。 最適化やカバレッジ計算の実装ポイントも紹介。
リアルタイムテキストレンダリングの再挑戦
- 過去にも何度か テキストのリアルタイムレンダリングに取り組んできた経験
- SDF(Signed Distance Field)方式 を以前採用したが、不満点が残存
- 新しいOLEDモニター のサブピクセル構造によるフリンジ問題が再挑戦のきっかけ
- GitHub上での議論参加 を通じてサブピクセルアンチエイリアスのアイデアを実装
- 多様なフォント (丸み・鋭角・極細線など)で描画テストを実施
SDF方式の課題
- 画質問題
- 特定フォント(細い線・複雑なディテール)でアーティファクト発生
- 解像度を上げても限界があり、細部が失われやすい
- アトラスサイズの肥大化
- SDFはオフライン生成でアトラス保存
- 多言語フォント(日本語・中国語)は巨大なアトラスが必要
- 複数フォント同時利用でメモリ・帯域コスト増大
- 柔軟性の不足
- ミニファイ・サブピクセルAAなど新機能追加が困難
- 任意ベクター画像対応には焼き込みが必要で、ランタイム編集不可
- システムの複雑化
- 中間処理や外部ライブラリ依存で理解・保守が煩雑化
- Bezier曲線 から直接描画できるシンプルな流れが理想
新手法の概要:ベクター曲線の動的ラスタライズ
- テクスチャへの焼き込み不要
- 表示中のグリフの曲線データを直接GPUへ送信
- GPU上でリアルタイムにラスタライズ処理
- アトラスには動的生成したグリフのみ保持
- 使用中グリフはアトラスに残し、再利用・高品質化
- サブピクセル単位での高精度アンチエイリアス実現
- ベクター直描画により
- 解像度制限なし
- アトラスあたりのストレージ・メモリコスト大幅削減
- サブピクセルAAや拡大縮小にも強い柔軟性
パイプライン全体の流れ
- FreeType利用によるフォントデータの曲線抽出
- フォント形式問わず対応
- 各グリフのライン・2次Bezier(3点)・3次Bezier(4点)を抽出
- 全ての曲線を2次Bezierへ変換
- ラインは中点追加で2次Bezier化
- 3次Bezierは2つの2次Bezierに分割(若干の誤差は許容)
- TrueType(.ttf)は元々2次Bezierのみ
- 曲線データのGPU転送・保存
- 曲線の始点・終点(青)、制御点(赤)を明示的に管理
カバレッジ計算とアンチエイリアス
- 各ピクセルごとに水平方向へレイを発射
- 曲線との交点を検出し、ウィンディングナンバーを計算
- 内外判定後、カバレッジ値に変換
- サブピクセルごとに複数サンプルを蓄積
- 数百サンプル(例:512)を平均化し高精度AA
- ごく稀な誤判定も平均化で実用上無視可能
- $R_2$系列による準ランダムサンプリング
- サンプル分布の最適化で画質向上
- 実装例コード
- 曲線集合のビットセット管理
- 各サブピクセルごとにカバレッジを加算・蓄積
曲線アクセスの最適化
- グリフを水平バンドに分割し、曲線インデックスを管理
- 各バンドに関連する曲線のみをビットで記録
- 水平トレース時の曲線アクセス数を大幅削減
- 高速化とメモリ効率化を両立
まとめ
- SDF方式の限界を克服し、ベクター曲線の動的ラスタライズで高品質・低コストを実現
- サブピクセルアンチエイリアスや多様なフォント対応が容易
- シンプルで理解しやすいパイプライン設計
- 今後もさらなる最適化・高精度化の余地あり