【发布时间】:2021-08-25 04:34:53
【问题描述】:
字体渲染库(例如 freetype)提供了一个函数,该函数将获取轮廓字体文件(例如 .ttf)和字符代码,并在主机内存中生成相应字形的位图。
对于小文本(比如最大 30x30 像素的字形),将这些字形渲染到 Vulkan 帧缓冲区的最有效方法是什么?
我考虑过的一些选项可能是:
-
每次按需使用字体渲染库渲染字形,用主机代码将它们blit到一个包含整个“文本框”的主机端图像,将文本框的主机端图像传输到本地设备图像,然后使用片段着色器/图像采样器从要绘制的文本框中渲染一个四边形(如普通图像)。
-
在程序启动周期通过所有字形主机端,将它们渲染为字形位图。执行与 1 相同的操作,但从缓存的字形位图中进行 blit(大约需要 1 MB 主机内存)。
-
将字形位图单独缓存到设备本地图像中。与其在主机端进行咬合,不如在设备端为每个字形渲染一个四边形,并每次将图像采样器设置为相应的字形。 (不确定绘制调用如何工作?每个字形一次绘制调用,每次使用不同的组合图像采样器?)
-
将所有字形位图缓存到一个大型设备端图像中(例如,以大网格布局)。使用单个设备端组合图像采样器,并推送参数来描述包含字形图像的子区域。每个字形一次绘制调用,每次更新推送参数。
-
与 4 类似,但使用单个实例绘制调用,而不是推送参数,而是使用实例变化的输入属性。
-
还有什么?
我的意思是,像 Unreal、Unity 或 Godot 等常见的游戏引擎是如何解决这个问题的?有没有典型的方法或最佳实践?
【问题讨论】:
标签: vulkan