c++ - 硬件加速 Unicode 文本渲染

标签 c++ graphics freetype2 text-rendering

我想使用 Free Type 2 编写一个硬件加速文本渲染器来加载字体、找到正确的字形及其大小等。

我的计划是在视频内存中有一个包含字形(对于给定的字体、大小等)的大纹理,并在系统内存中为每个纹理定义一个表来定义有关纹理内容的信息。

然后我可以使用该表构建一个顶点缓冲区来渲染文本。

我面临的问题是纹理的构造,为 Unicode 中的每个字形创建纹理是不切实际的,实在是太多了。过去对于 Ascii,我只是在图像编辑器中构建纹理,然后根据需要自己提前填写表格,但是为此我需要某种动态系统来获取所需的字形,同时有效地将它们缓存到避免将相同字形重复上传到 vram...(我猜是某种最不常用的系统)

另一个问题是不是所有的字形都是相同的大小,我可以将纹理分成一个足够大的网格以容纳最大的字形(我需要一些方法来准确计算)这使得将字形适合纹理变得容易和用新的字形替换它们(基于最不常用的或其他东西),但是这会留下很多浪费的空间,但我不确定如何更有效地打包它们而不会因为字形被换入和换出而遇到碎片问题...

我还假设如果纹理仍在用于之前的一些文本,更新纹理可能会使图形硬件停止运行,这是一个正确的假设吗?如果是这种情况,我该如何避免呢?

最佳答案

文本呈现是很多复杂的问题然后“粘贴”一些字形...不仅复杂, 它非常复杂:字距调整、连字、间距、双向文本、元音等等......

为什么不使用像 Pango 这样的用于文本渲染的普通库来创建文本,创建位图并将其显示为 3D 对象上的位图(如果我了解您的需要)。

编辑:简单的 HTML 标记也可以用 Pango 呈现:http://library.gnome.org/devel/pango/unstable/PangoMarkupFormat.html

关于c++ - 硬件加速 Unicode 文本渲染,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1187524/

相关文章:

macos - Mac 上是否预装了 freetype?

render - 为什么渲染字形这么慢?

c++ - 添加图标资源而不更改EXE图标?

c++ - 如何使用 D3DPT_TRIANGLESTRIP 基元类型在 DirectX 中绘制两个分离的矩形

graphics - 方案图形有多个奇数

c++ - 为什么 vulkan 在集成显卡和 GPU 的系统中报告单个设备?

android - Freetype FT_Request_Size() 在 Android 上崩溃

c++ - 如何使 -Wl,-y 可用于 C++ 代码

c++ - Vector 没有退缩

c++ - 在 CMake 项目中包含 libsimdpp