これは、擬似コードでフォントレンダリングを処理する方法です(簡略化):
FontFace* CreateFontFace(fontName, fontSize)
{
FontFace* fontFace = LoadFromDiskCache(fontName, fontSize);
if ( fontFace == 0 )
{
for(each glyph)
{
Load glyph using FreeType;
Load its size and metric;
}
Pack all glyph bitmaps to a single UV-atlas
{
Calculate rectangles (RectangleBinPack); // Very slow!
Blit glyphs to UV-atlas; // Slow!
Insert rectangles to std::vector; // UV-dictionary;
Insert metrics to std::vector;
}
Wrap it all to a struct FontFace;
AddToDiskCache(fontName, fontSize);
// so on next startup it will be cached on HDD
}
return fontFace;
}
bool OnInit(fontName, fontSize)
{
for (each fontName)
{
for (each fontSize)
{
FontFace* fontFace = CreateFontFace(fontName, fontSize));
Insert fontFace to container based on std::map;
}
}
}
void OnSomtimes(FontFace, pDevice)
{
On demand create texture from FontFace.uvatlas on pDevice;
}
void OnRender(wstring, FontFace)
{
if(needUpdate)
{
// Generate std::vector<Sprite> using given FontFace
sprites = CreateSprites(wstring, FontFace);
}
Draw all vector<Sprite> at once with my SpriteBatch object;
// Big dynamic VertexBuffer, Instancing or GeometryShader
// depending on hardware caps
}
そのため、最も使用されているフォントの一部、またはゲーム内で使用されたことのあるすべてのフォントをキャッシュできます。ただし、一部のアプリでは、ユーザーは、アプリがこれまでに見たことのない別のフォント/サイズ/スタイルをその場で選択するだけで、すぐに適用されます。または、たとえば、一部のゲームでは、ユーザーがゲーム フォルダー内の「font.tff」ファイルを置き換えることができ、ゲームは起動時に多くのサイズ/スタイルで、何千もの Unicode 文字ごとに、追加の時間のかかるプリロードなしで使用します。奇跡!
このようなものが必要です-オンザフライのフォント読み込み。
もちろん、必要に応じてグリフを個別にロードし、グリフごとにレンダリングできますが、これは、バッチ処理がなく、フレームごとに数千回の Draw 呼び出しが必要であり、GPU 帯域幅が膨大であることを意味します。OpenGL では問題ないかどうかはわかりませんが、D3D11 では問題ありません。
彼らはゲームスタジオでどのようにそれを行うのですか? 多分あなたは別のアプローチを知っていますか?フォントをジオメトリ、GPU 処理、および複雑な曲線アルゴリズムとしてレンダリングすることについて聞いたことがありますが、Google で役立つ情報を見つけることができません。
どんな助けでも大歓迎です!