12

我正在使用 PowerVR OpenGL ES 2 SDK 在 Windows 上使用 C++ 开发我的游戏,然后我可以将它移植到 android 或 iphone。

一切看起来都很好,但我现在被文本渲染困住了。我找不到任何关于使用 C++ 在 OpenGL ES 2.0 中渲染文本(使用 TTF 或位图字体)的详细教程。我发现很多关于使用java或objective-c(带有textview、surfaceview或一些诸如此类的东西)在android或iphone上渲染文本的话题,但我认为这不是我需要的。我需要一个“跨平台解决方案”。(或者我现在可能错了吗?)

经过一番研究,我想到了解决方案:

加载和绑定位图字体纹理->解析文本并生成和绑定顶点数组,使用 uv 数组映射纹理,... ->将其渲染到屏幕

我还没有经过测试,但我认为在使用我的解决方案时会出现问题:当我想更改文本时(例如:我正在为用户评分或屏幕上的计时器)我必须重新绑定顶点数组和 uv数组,这不是一个好主意,对吧?

有没有更好的方法/正确的方法来使用 OpenGL ES 2 在屏幕上绘制位图字体?

4

3 回答 3

4

您提到的解决方案是可行的方法,实际上,如果您修改文本,则必须重新创建代表它的几何图形,并将其重新提交给 OpenGL。

这个娱乐步骤需要一些时间,但肯定不会太多。

对于渲染文本,问题有两个主要组成部分:

  • 创建你的纹理图集位图
  • 使用此纹理绘制文本,考虑字体指标(大小、字距调整等)和可能的亚像素抗锯齿

要创建纹理图集,您可以找到一些代码(可能使用 freetype)或使用现有工具(例如AngleCode 的 bmfont)。

对于绘图,您可能希望基于一些现有代码推出自己的代码,因为有很多细节需要正确获得好看的文本。要开始你的头痛,你可以看看这篇文章

一个很好的现代灵感来源可能是Nicolas Rougier 的 freetype-gl代码。

于 2012-08-03T09:37:04.193 回答
2

文本渲染是 3D 图书馆世界中大多数新手迟早需要面对的主题之一。

互联网上有很多关于文本渲染的教程,很多书都在谈论它。我的建议是环顾四周并尝试了解它们是如何工作的。

TTF 字体不是一个可行的解决方案,因为在实时计算场景(如计算机游戏)中,基于几何的 TTF 技术会消耗太多资源。

一个非常常见的解决方案(例如,我在 PATRIA 3D 引擎中使用的那个)是使用包含不同字符字形的纹理图集,然后您的应用程序逻辑需要处理 text-->glyph 位置关系以进行纹理将构成您最终的“屏幕文本”的四边形。

文本渲染不是一个简单的主题,因为它涉及诸如字距调整/间距/不同文本大小等主题。

尝试点击此链接以最好地理解该主题(如果我没记错的话,这个 wiki 的作者就是这个社区的活跃成员)。

http://en.wikibooks.org/wiki/OpenGL_Programming/Modern_OpenGL_Tutorial_Text_Rendering_01

于 2012-08-03T07:12:49.830 回答
0

在游戏中绘制文本的正确方法是使用带有包含距离字段的字形的纹理图集: https ://www.mapbox.com/blog/text-signed-distance-fields/

另请参阅 Valve(Half-Life 和 Portal 的创建者)的这篇 Siggraph 论文,描述了该技术的变化:http ://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf

基于距离字段的文本质量远高于基于纯位图的文本。它还使用更少的内存,因为距离字段小于字体的逐字位图表示。

于 2015-12-07T20:07:27.240 回答