我有一个应用程序,它是一个使用带有GLKit的opengles的小游戏。 当我想要绘制文本时,我不知道它是如何工作的 我的屏幕(如果可能的话)。
我该怎么做?
我使用图像绘制所有游戏对象(包裹在某种形式中) 精灵)。它可以缩放,移动和旋转。 一切正常。
但要了解如何在该glkview上打印文本 让我深入了解问题^^
我不想使用uiimages因为我也不知道如何 在glkview上呈现uiimages。
答案 0 :(得分:0)
有很多方法可以做你想做的事情:
1)拥有一张包含所需文字字形的图像。例如,如果您的应用程序是英语,则图像中将包含26个大写字母和26个小写字母。将该纹理上传到GPU并使用正确的纹理坐标或glSubTexImage2d()
来拉出所需的字形。 (我不清楚这是否是你不想要UIImage的意思。它不一定是UIImage,虽然这可能是最简单的。)
2)每次需要显示文本时,请立即在CPU上绘制文本,并将整个单词,短语或句子作为纹理上传。您可以创建CGBitmapContext
并使用Core Graphics为其绘制文本。然后使用glTexImage2D()
上传它。
3)从字体中获取单个字形并使用构成字形的贝塞尔曲线直接绘制。这也允许3D挤压。但是,此选项对代码来说是最耗时的,并且可能性能最差。它还涉及处理字体所具有的许多小问题(如退化段和不正确的绕组顺序)。如果你想沿着这条路走下去,我想也许Core Text可以提供帮助。
答案 1 :(得分:0)
根据您的要求,至少有两种干净的方法可以做到这一点。
虽然文档建议不要通过CAEAGLLayer
(GLKView)进行合成,但是在CAEAGLLayer之上层叠透明内容时,至少在最近的iOS版本中它可以很好地工作。例如,尝试在Apple GLKit模板或应用程序的Interface Builder中的Storyboard中的GLKView顶部放置一个UITextView,其中opaque设置为false,背景颜色为 clear 。在我对iPhone 5的测试中,即使在文本视图中滚动,帧渲染时间仍保持在1ms左右。如果您的文本需求是静态的,或者您不希望用户与文本交互,请使用CATextLayer作为EAGLLayer的子图层而不是视图。
第二种方法是将文本渲染为纹理。然后,您可以通过禁用深度缓冲区并在全屏矩形上渲染纹理,将文本合成到视图上。查看UIGraphicsBeginImageContextWithOptions
以了解如何使用Quartz渲染到屏幕外图像。 UIGraphicsGetImageFromCurrentImageContext
允许您检索UIImage以用作纹理。