OpenGL + SDL_TTF:纹理索引回收
OpenGL + SDL_TTF: texture index recycling
我目前正在将一堆应用程序从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:我目前正在开发一种新的基于着色器的字形光栅器,它解决了大多数已知问题,但尚未完成。
- 数组索引的值没有增加
- 芬威克树(BIT).找到具有给定累积频率的最小索引,单位为 O(logN)
- OpenInventor从9.8升级到10.4.2后,GLSL纹理返回零
- 查找最接近的大于当前数字的数字的索引
- 在C++中调整向量中的索引
- SFML纹理像播放器
- 重载元组索引运算符-C++
- OpenGL大的3D纹理(>2GB)非常慢
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 给定一个向量,如何找到该向量的所有子集和的原始索引
- 为std::string的某个索引赋值
- 并行用于C++17中数组索引范围内的循环
- 着色器纹理值与创建纹理时写入的值不同
- 跟随整数索引列表的自定义类迭代器
- 移植DXUT SDKMesh以导入OBJ文件,在哪里添加纹理坐标和索引
- 如何使用索引的 PNG 图像作为 SDL2/OpenGL 的纹理
- 使用纹理,法线和索引列表从VBO绘制OpenGL对象的问题
- OpenGL 3.1 使用索引绘图渲染纹理时出现问题
- OpenGL + SDL_TTF:纹理索引回收
- 将纹理应用于索引基元.c++ DX9