gpt4 book ai didi

c++ - 商业游戏如何处理动态字体加载?

转载 作者:搜寻专家 更新时间:2023-10-31 01:13:06 28 4
gpt4 key购买 nike

这是我在伪代码中处理字体渲染的方式(简化):

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 字符中的每一个使用它,而无需额外耗时的预加载。奇迹!

我需要这样的东西 - 即时字体加载。

当然,我可以按需单独加载字形,并逐个呈现字形,但这意味着没有批处理、每帧数以千计的绘制调用和巨大的 GPU 带宽。不确定是否适用于 OpenGL,但不适用于 D3D11。

他们如何在游戏工作室中做到这一点?也许你知道一种不同的方法?我听说过将字体渲染为几何体、GPU 处理和复杂的曲线算法,但无法在谷歌中找到有用的信息。

任何帮助将不胜感激!

最佳答案

游戏中的字体渲染通常是从位图完成的,位图包含在编译/离线时生成的所有字形。您可以使用像 AngelCode BMFont 这样的位图字体生成器它非常易于使用并且非常适合游戏,因为它支持对 GPU 带宽更友好的 DXTx 压缩位图。

对于高分辨率字体,Alpha Texted Magnification技术是目前游戏中的首选技术,主要是在渲染贴花时。

关于c++ - 商业游戏如何处理动态字体加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12997411/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com