【问题标题】:The correct way to draw text in OpenGL ES 2在 OpenGL ES 2 中绘制文本的正确方法
【发布时间】:2012-08-01 02:15:08
【问题描述】:

我正在使用 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 在屏幕上绘制位图字体?

【问题讨论】:

    标签: android iphone c++ opengl-es-2.0 bitmap-fonts


    【解决方案1】:

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

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

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

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

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

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

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

    【讨论】:

    • 有人有支持旋转的 OpenGL ES 2.0 Android 示例吗?
    【解决方案2】:

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

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

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

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

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

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

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-08-02
        • 1970-01-01
        • 2012-06-30
        • 1970-01-01
        • 2011-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多