硬件加速Unicode文本呈现

时间:2009-07-27 10:41:42

标签: c++ graphics freetype2 text-rendering

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

我这样做的计划是在视频内存中包含一个包含字形(对于给定的字体,大小等)的大纹理,以及一个表格,用于定义有关系统内存中纹理内容的信息。

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

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

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

此外,我假设如果纹理仍然用于某些先前的文本,更新纹理可能会停止图形硬件,这是一个正确的假设,如果是这样的话我该如何避免呢?

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:1)

Cairo支持将硬件加速渲染到many surface types

有一个名为FontForge的库正在使用Cairo进行渲染,但我自己没有尝试过。你应该检查一下,让我知道它是怎么回事: - )