OpenGL フォントのレンダリングには多くの疑問があり、それらの多くはテクスチャ アトラス (高速だが間違っている) または文字列テクスチャ (固定テキストのみ) で解決されます。
ただし、これらのアプローチは不十分であり、時代遅れのようです (シェーダーを使用してこれをより良く/より速く行うにはどうすればよいでしょうか?)。OpenGL 4.1 の場合、「今日は何を使用する必要がありますか?」という優れた質問があります。
バージョン 4.1 の OpenGL でのテキスト レンダリングの最新技術は何ですか?
では、今日の iOS GL ES 2では何を使用すればよいのでしょうか?
オープンソース (または商用ソリューションでさえ) がないように見えることに失望しています。多くのチームがこの車輪の再発明に数週間の開発時間を費やし、カーニングやスペースなどの方法を徐々に学習していることを私は知っています (うーん) - しかし、「フォント」全体を書き直すよりも良い方法があるに違いありません。最初から?
私が見る限り、これには 2 つの部分があります。
- フォントを使用してテキストをレンダリングするにはどうすればよいですか?
- 出力をどのように表示しますか?
1(レンダリング方法)については、Appleは「正しい」レンダリング出力を取得する多くの方法を提供していますが、「簡単な」ものはOpenGLをサポートしていません(おそらく他のいくつかはサポートしています-たとえば、CoreText出力をマップする簡単な方法はありますかOpenGL に?)。
2 (表示方法) については、シェーダー、VBO、グリフ テクスチャ、ルックアップ テクスチャ、およびその他のテクニック (たとえば、上記のリンクの OpenGL 4.1 のもの?) があります。
私が知っている 2 つの一般的な OpenGL アプローチを次に示します。
- テクスチャ アトラス (すべてのグリフを 1 回レンダリングしてから、共有テクスチャから文字ごとに 1 つのテクスチャ クワッドをレンダリング)
- 1980 年代の「ビットマップ フォント」を使用していない限り、これは間違っています (その場合でも、重要なフォントを修正する必要がある場合、テクスチャ アトラスは見た目よりも多くの作業を必要とします)。
- (フォントは「グリフのコレクション」ではありません。膨大な量の配置、レイアウト、折り返し、間隔、カーニング、スタイリング、色付け、重み付けなどがあります。テクスチャ アトラスは失敗します)
- 固定文字列 (任意の Apple クラスを使用して正しくレンダリングし、バッキング イメージ データのスクリーンショットを作成し、テクスチャとしてアップロードします)
- 人間的には、これは高速です。フレーム レンダリングでは、これは非常に遅くなります。多くの変更テキストでこれを行うと、フレームレートが床を通り抜けます
- 技術的には、それはおおむね正しい (完全ではない: この方法でいくつかの情報を失う) が、非常に非効率的である
私も見ましたが、次のことについて良い点と悪い点の両方を聞きました。
- Imagination/PowerVR "Print3D" (リンクが壊れています) (GPU を製造している会社から! しかし、彼らのサイトはテキスト レンダリング ページを移動/削除しました)
- FreeType (前処理、解釈、大量のコード、追加のライブラリが必要ですか?)
- ...および/または FTGL http://sourceforge.net/projects/ftgl/ (噂: 遅い? バグがある? 長い間更新されていない?)
- Font-Stash http://digestingduck.blogspot.co.uk/2009/08/font-stash.html (高品質ですが、非常に遅いですか?) 1.
Apple 独自の OS / 標準ライブラリ内で、テキスト レンダリングのいくつかのソースを知っています。注意:私はこれらのほとんどを 2D レンダリング プロジェクトで詳細に使用しました。異なるレンダリングを出力することについての私の記述は、直接の経験に基づいています。
- NSString を使用した CoreGraphics
- 最も簡単な方法: 「CGRect に」レンダリングする
- 人々が推奨する「固定文字列」アプローチのわずかに高速なバージョンのようです (ただし、ほとんど同じであると予想されます)。
- プレーンテキストの UILabel と UITextArea
- 注意: それらは同じではありません! smae テキストのレンダリング方法のわずかな違い
- 上記のいずれかにレンダリングされる NSAttributedString
- 繰り返しますが、レンダリングが異なります(私が知っている違いはかなり微妙で、「バグ」として分類されます。これに関するさまざまなSOの質問)
- CATextLayer
- iOS フォントと古い C レンダリングのハイブリッド。「完全ではない」無料でブリッジされた CFFont / UIFont を使用します。これにより、レンダリングの違いや奇妙さがさらに明らかになります
- コアテキスト
- ...究極の解決策?しかし、それ自身の獣...