OpenGL + SDL_TTF:纹理索引回收

OpenGL + SDL_TTF: texture index recycling

本文关键字:纹理 索引 TTF SDL OpenGL      更新时间:2023-10-16

我目前正在将一堆应用程序从SDL2渲染(内部使用OpenGL)迁移到"纯"OpenGL渲染。在这项工作中,我想出了如何将纹理上传到 GPU,并了解到每个纹理都有一个索引。

为了渲染文本,我使用了SDL_TTF函数,基本上允许您将纹理上传到 GPU 以描绘一些文本。我正在迁移的大多数应用程序的文本都不重,但我注意到它们可能存在问题。

假设一个应用程序接受用户文本输入并放入屏幕上:每次击键都会生成一个新纹理,其中包含输入的所有文本(与相同功能相关的任何其他先前纹理都将被删除)。因此,要写"Hello",我们会得到五个纹理:"H"、"He"、"Hel"、"Hell",最后是"Hello"。如前所述,每个"以前的"纹理(在这种情况下从"H"到"Hell")都将被删除,只保留"Hello"的内存。

尽管如此,在文本繁重的应用程序中(例如,使用此方法放置游戏的分数,做得很糟糕,以至于您为每一帧生成一个新纹理),大量纹理将被上传和删除,纹理索引将继续增长。

我的主要问题是:OpenGL会回收这些索引,还是会耗尽数字并崩溃?

PS:我知道有可能将所有TTF字符打包到地图集中,然后得到我需要的字母。我现在不想研究这个问题,除非我目前的方法很危险(这个 atlas 的东西感觉有点像旧的位图字体)。

PS2:我也知道不断更改纹理并不完全是性能(GPU 明智),但这些应用程序在图形上没有挑战性,并且在旧系统中具有良好的性能。

OpenGL对象由OpenGL规范称为"名称"来引用(编程中其他常用的术语是"handle"或"id"/"identifier")。当新名称首次绑定(带有glBind…)时,将创建相应的OpenGL对象(纹理,缓冲区等);一些 OpenGL 函数创建对象并返回其名称 ( glCreate… )。删除(有效)名称(带glDelete…)后,一旦释放对它的最后一个内部引用,相应的 OpenGL 对象将被释放。名称可以在删除后被有效地重用(由OpenGL),然后引用不同的对象。


不要重新发明轮子。使用 OpenGL 进行文本渲染非常复杂,并且(尚¹)不存在一种完美的方法。但是,有几个库可以解决纹理生成和资源管理问题。帮自己一个忙,使用其中之一。在您的情况下,freetype-gl 将是最佳选择(恕我直言):https://github.com/rougier/freetype-gl


1:我目前正在开发一种新的基于着色器的字形光栅器,它解决了大多数已知问题,但尚未完成。