3

OpenGL でテキストをレンダリングし、そのテクスチャを SDL でロードする新しい方法を探してテストしてきましたが、テストするすべての技術は高価で遅いようです。

考えてみると、おそらくそれを実装する最善の方法は、必要なすべての文字 (スプライトシートのように) をテクスチャにロードし、それに関する関連データ (幅、高さ、進行、行スキップ...) を取得することであることに気付きました。それをレンダリングする (基本的に、シーンで他のすべてのレンダリングを行った後に行う) 場合、画面に必要なすべての文字列を出力するために必要な glBindTexture() は 1 つだけです。

ここでは、高価な部分はテクスチャの作成とバインディングだと思いますよね? 私がテストしたすべてのコードは、各グリフまたは各文字列に個別のテクスチャを使用しているようです。

皆さんはどのようにテキストをレンダリングしますか? それをレンダリングするのは良い方法ですか?もしそうなら、すでにそれを行っているライブラリはありますか?

4

3 に答える 3

4

すべての文字を含む「スプライトシートのような」テクスチャを使用してテキストをレンダリングすることは確かに機能し、それを行うための非常に一般的な方法です。

このようなテキストをレンダリングするためのライブラリを知りませんが (確かにあると思いますが)、自分でコードを書くだけならそれほど難しいことではありません。独自のコードを書きたい場合は、必要なすべての文字を含むテクスチャを生成する何らかの方法が必要になります。BMFontは、このようなテクスチャを生成できるプログラムの 1 つです。さらに、BMFont は、各文字がテクスチャ内のどこにあるかを示す付属の「.fnt」ファイルを生成します。

BMFont によって生成されたテクスチャは次のようになります。

サイズ 22 Times New Roman の BMFont テクスチャ

および .fnt ファイル:

info face="Times New Roman" size=-22 bold=0 italic=0 charset="" unicode=1 stretchH=100 smooth=1 aa=1 padding=0,0,0,0 spacing=1,1 outline=0
common lineHeight=25 base=20 scaleW=256 scaleH=256 pages=1 packed=0 alphaChnl=0 redChnl=4 greenChnl=4 blueChnl=4
page id=0 file="Times22.png"
chars count=191
char id=32   x=253   y=37    width=1     height=1     xoffset=0     yoffset=20    xadvance=6     page=0  chnl=15
char id=33   x=253   y=21    width=2     height=15    xoffset=2     yoffset=5     xadvance=6     page=0  chnl=15
char id=34   x=195   y=118   width=6     height=6     xoffset=2     yoffset=5     xadvance=9     page=0  chnl=15
char id=35   x=72    y=42    width=11    height=16    xoffset=0     yoffset=4     xadvance=11    page=0  chnl=15
char id=36   x=17    y=43    width=9     height=17    xoffset=1     yoffset=4     xadvance=11    page=0  chnl=15
...
于 2012-08-25T00:55:26.637 に答える
0

オプションでカーニングを含むコンパクトなフォントビットマップを構築でき、フォントをロードして表示するためのソースコードが含まれている別のものを次に示します。

https://github.com/SudoMike/SudoFont

于 2014-05-09T21:57:48.027 に答える
0

FreeType を使用してオンザフライでグリフ ビットマップを生成し、選択したボックス パッキングアルゴリズムを使用してそれらを 1 つ (または複数) の大きなテクスチャに詰め込みます。

あなたが言ったように、ほとんどの文字列は 1 つ、おそらく 2 つのテクスチャ バインドしか必要としません。

于 2012-08-22T21:00:10.793 に答える