Kor*_*icz 41 opengl performance text-rendering
我正在实现一个基于OpenGL构建的GUI.我遇到了每个GUI都有的问题 - 文本渲染.我知道在OpenGL中渲染文本的几种方法,但是,我想知道哪种方法最适合GUI.
通常在GUI中我们有两种类型的文本 - 静态和实时.静态很容易 - 我们可以将TTF渲染到纹理并忘记它.这是"现场"文本,更让我烦恼 - 想象控制台,或多人游戏中的实时聊天.
我想到了几个选择:
因此问题是 - 如何有效地在OpenGL中呈现文本?
如果这有帮助,我将使用STL/Boost-heavy C++进行编码,并针对GForce 6及更高版本的显卡.
Gre*_*osz 30
EDIT2:Sean Barrett刚刚发布了C/C++ 3D程序员的Bitmap字体.
编辑:另一个值得一看的代码宝石是Font Stash,它利用了Sean Barrett的stb_truetype.h.
您可以创建一个纹理,在其中渲染字体的所有字符.然后,您只需绘制带有正交投影和正确纹理坐标的纹理四边形:当您的文本使用的语言不包含太多符号时,此方法就可以使用:如英语.字体纹理在应用程序开始时创建一次,然后渲染四边形非常快.
这就是我正在使用的东西,我相信这是在OpenGL中渲染文本的最快方法.起初,我使用了Angelcode的Bitmap字体生成器工具,然后我直接集成了FreeType,并在应用程序启动时构建了一个包含所有字形的大纹理.至于提高四边形渲染速度的技巧,我只是在我的应用程序中使用VBO作为其余几何体.
我很惊讶你对四边形渲染有疑问,而你似乎并不担心在cpu上生成纹理的性能,然后上传它,然后将它绑定到最后用它渲染一个矩形,每个帧.更改OpenGL状态是瓶颈,而不是您将用于文本的500-1000个四边形.
另外,看看FTGL库这样的库,它将整个字体转换为多边形(几何字体).
试试这个:http://dmedia.dprogramming.com/?n = Tutorials.TextRendering1.
所描述的方法是使用图形API进行文本呈现的典型方法.每个四边形一个字符,以及单个纹理中文本的所有图像数据.如果你可以将整个字符集合成一个纹理(实际上,根据纹理的大小,你可能能够适应几个),渲染速度非常快.
关键是纹理绑定是您需要最小化的操作.如果您可以使用单个纹理渲染所有文本,则无需将多少文本放在屏幕上.即使您必须多次切换纹理(不同的字体,不同的字体属性[粗体,下划线等]),性能仍然应该很好.文本性能对于HUD可能更为关键,但在GUI中则不那么重要.
您可以将文本渲染为三角面,并避免使用纹理。这样,可以避免在缩放文本时使边缘不清晰。我创作了一种低聚ASCII字体,该字体是开源的,可以在我的github上找到。
在文本上具有清晰边缘的另一种方法是SDF字体渲染,但这会受到一些假象的影响。
| 归档时间: |
|
| 查看次数: |
32745 次 |
| 最近记录: |