1

我有一个应用程序,它是一个使用带有 GLKit 的 opengles 的小游戏。没有我想知道当我想在我的屏幕上绘制文本时它是如何工作的(如果可能的话)。

我该怎么做?

我使用图像(包装在某种精灵中)绘制我所有的游戏对象。它可以缩放、移动和旋转。一切正常。

但是找出在那个glkview上打印文本的工作原理让我深入了解问题^^

我不想使用 uiimages,因为我也不知道如何在 glkview 上呈现 uiimages。

4

2 回答 2

0

有很多方法可以做你想做的事:

1)有一张图片,里面有你需要的所有文字字形。例如,如果您的应用程序是英文的,则图像中有 26 个大写字母和 26 个小写字母。将该纹理上传到 GPU 并使用正确的纹理坐标或glSubTexImage2d()提取您需要的字形。(我不清楚这是否是您不想要 UIImage 的意思。它不一定是 UIImage,尽管这可能是最简单的。)

2) 每次需要显示文本时,在 CPU 上动态绘制,并将整个单词、短语或句子作为纹理上传。您可以创建一个CGBitmapContext并使用 Core Graphics 向其绘制文本。然后使用glTexImage2D().

3)从字体中取出单独的字形,并直接使用构成字形的贝塞尔曲线进行绘制。这也允许进行 3D 挤压。但是,此选项是最耗时的编码并且可能性能最低。它还涉及处理字体具有的许多小问题(如退化段和不正确的缠绕顺序)。如果你想走这条路,我想Core Text可能会有所帮助。

于 2013-05-07T22:15:50.730 回答
0

根据您的要求,至少有两种干净的方法可以做到这一点。

虽然文档建议不要在CAEAGLLayer(GLKView) 上进行合成,但至少在最近的 iOS 版本中,当透明内容分层在 CAEAGLLayer 之上时,它的效果很好。例如,尝试在 Apple GLKit 模板或应用程序的 Interface Builder 中的 Storyboard 中的 Storyboard 顶部放置一个 UITextView,将 opaque 设置为 false 和清晰的背景色。在我对 iPhone 5 的测试中,帧渲染时间保持在 1 毫秒左右,即使在文本视图中滚动时也是如此。如果您的文本需求是静态的,或者您不希望用户与文本交互,请使用 CATextLayer 作为 EAGLLayer 的子层而不是视图。

第二种方法是将文本渲染为纹理。然后,您可以通过禁用深度缓冲区并在全屏矩形上渲染纹理来将文本合成到您的视图中。查看UIGraphicsBeginImageContextWithOptions如何使用 Quartz 渲染到屏幕外图像。UIGraphicsGetImageFromCurrentImageContext允许您检索 UIImage 以用作纹理。

于 2013-05-11T04:25:52.213 回答