OpenGL + SDL_TTF:纹理索引回收

时间:2016-07-10 17:35:19

标签: c++ opengl sdl-ttf

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

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

想象一个接受用户文本输入并放入屏幕的应用程序:每次击键都会生成一个新纹理,其中输入了所有文本(将删除与相同功能相关的任何其他先前纹理)。所以,写'#34;你好"我们会得到五种纹理:" H","他"," Hel"," Hell"最后"你好"。如上所述,每个"之前"纹理(在这种情况下来自" H"到"地狱")将被删除,只有" Hello"会留下来的。

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

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

PS:我知道将所有TTF字符打包成地图集的可能性,只是得到我需要的字母。除非我目前的方法很危险,否则我现在不想调查它(这种地图集的感觉就像旧的位图字体)。

PS2:我也意识到不断改变纹理并不具备精确的性能(GPU智能),但这些应用程序在图形上并不具有挑战性,并且在旧系统中具有良好的性能。

1 个答案:

答案 0 :(得分:2)

OpenGL对象由OpenGL规范称为“名称”引用(编程中其他常用术语是“句柄”或“id”/“标识符”)。首次绑定新名称(使用glBind…)时,会创建相应的OpenGL对象(纹理,缓冲区等);一些OpenGL函数创建对象并将名称返回给它(glCreate…)。删除(有效)名称后(使用glDelete…),相应的OpenGL对象将在释放最后一个内部引用后被释放。删除后,名称可以有效地重复使用(通过OpenGL),然后引用不同的对象。

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

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