Cocoa touch iPhone SDK是否有一个像样的OpenGL文本绘图库?

Cocoa touch iPhone SDK是否有一个像样的OpenGL文本绘图库?,cocoa-touch,opengl-es,freetype,Cocoa Touch,Opengl Es,Freetype,我正试图找出一个简单的方法来在OpenGL中绘制一些文本。我的研究表明这是一项相当复杂的任务。它包括创建(或在运行时生成)字体图集纹理,然后为每个字母创建一个具有正确位置和纹理坐标的四边形 我听过一些关于freetype的好消息,但是对于如何在iPhone上运行它,我发现很少,而且它看起来相当复杂 那么,有没有任何Objective-C包装的OpenGL文本库可以与人们一直在使用的iPhone SDK一起使用呢?还是我只是想得太多了,我缺少了一个更简单的方法?查看迫降演示。提供的Texture2

我正试图找出一个简单的方法来在OpenGL中绘制一些文本。我的研究表明这是一项相当复杂的任务。它包括创建(或在运行时生成)字体图集纹理,然后为每个字母创建一个具有正确位置和纹理坐标的四边形

我听过一些关于freetype的好消息,但是对于如何在iPhone上运行它,我发现很少,而且它看起来相当复杂


那么,有没有任何Objective-C包装的OpenGL文本库可以与人们一直在使用的iPhone SDK一起使用呢?还是我只是想得太多了,我缺少了一个更简单的方法?

查看迫降演示。提供的Texture2D类允许使用文本和字体创建纹理。(希望会有一个更好的答案,我希望有一个更简单的方法来绘制opengles视图)

您关于使用freetype创建纹理图集以及所有字形信息的描述正是我在当前iPhone项目中所做的

我在一个预处理步骤中对字体进行了所有的解析(在Windows上,所有的解析都是在C#中进行的)。地图集本身被生成,并且只包含所需的字符-为了减少空间,我有时也会生成多个地图集,以保持纹理大小为2且分辨率合理

您可以轻松地从freetype中提取字形信息。在运行时将其与纹理一起传递到应用程序,然后根据需要更改纹理的UV坐标就相当简单了

值得一提的是,我在我的小引擎中定义了一个字形字符:

struct FontGlyph
{

u32 char_code;

u32 m_x;                // base x position on tpage

u32 m_y;            // base y position on tpage

u32 m_width;            // glyph width

u32 m_height;           // glyph height

i32 m_horiBearingX;     // Distance to X shift

i32 m_horiBearingY;     // Distance to Y shift

u32 m_horiAdvance;      // Total Horizontal advance this character requires

u32 m__tpage_index;     // Which tpage does this glyph use?

};
然后我有了一个“SpriteString”对象,它的行为与任何其他字符串非常相似,除了我可以使用sprite绘制它之外

我同意,对于一个相当琐碎的问题来说,这一切似乎都是一项艰巨的任务,但我发现它给了我很大的灵活性,而且在我着手实施时,真的没有花那么长时间

如果您需要任何其他详细信息,请随时回复或评论。(祝你好运:)


回复你的评论,因为我在评论区的空间用完了

查看freetype文档,它基本上为您提供字形数据,而不会弄乱,它只是将其从字体中拉出来。至于纹理本身,您可以使用freetype渲染每个glyph,然后管理它来构建纹理。这是一个完全独立于主应用程序的预处理过程

下面是我的工具代码的一个摘录,它可以做到这一点:


不过请注意,这只是为了我的眼睛,而不是为了公众消费,所以请原谅这一事实:)

一种方法是设置UILabel,然后将其图层渲染成纹理。实现这一点的间接途径是首先使用文本、字体等设置UILabel,然后使用以下代码

UIGraphicsBeginImageContext(yourLabel.frame.size);
[yourLabel.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *layerImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
将UILabel捕获到UIImage。然后可以在CrashLanding项目中使用Texture2D类的initWithImage:构造函数将其转换为纹理

它看起来像initWithImage:在该示例中,将UIImage重新渲染为位图上下文,并使用该上下文创建纹理。只需做一点工作,就可以从该方法中提取相关代码,并修改上述代码,将层直接渲染到纹理中


这样,在为纹理创建文本时,您可以获得UILabel对Unicode和字体的良好支持。

我找到了一个简单的解决方案。这是我为它编写的一个快速函数。(您将需要Texture2D类。)


我相信输入坐标需要在你的世界坐标中,但我不确定这是否在一般情况下是正确的,或者它是否对我有效。您可能需要使用偏移量才能使其正确。

谢谢您的方法。这节省了我一些时间

但有几件事我必须改变。glBlendFunc调用需要是:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_ALPHA)
第二,文本似乎被划入了一个点。CGRectMake调用正在创建1x1矩形,除非我读错了。

使用“沉思”字体库:

简单:)

它支持unicode,按需加载字形,甚至还有一种输出变量的方法

font.print(x, y, z) << "fps: " << fps;

font.print(x,y,z)是的,我知道有两个。诀窍是,您必须使用Quartz(CGContext*函数)渲染到纹理,然后渲染该纹理以供用户查看

如果您关心性能,还可以使用Quartz生成纹理图谱

在xCode中创建纹理生成工具相当容易

您所要做的就是拥有一个有效的CGContext。您可以在本文中找到一些非常好的示例代码

基本上,代码是这样的:

// Create the cgcontext as shown by links above

// Now to render text into the cg context,
// the drop the raw data behind the cgcontext
// to opengl.  2 ways to do this:
// 1)  CG* way: (advantage: easy to use color)
CGContextSelectFont(cgContext, "Arial", 24, kCGEncodingMacRoman);

// set color to yellow text
CGContextSetRGBFillColor(cgContext, 1, 1, 0, 1) ; // Be sure to use FILL not stroke!

// draw it in there
CGContextShowTextAtPoint(cgContext, 20, 20, "HI THERE", strlen("HI THERE") ) ;

/*
// WAY #2:  this way it's always black and white
// DRAW SOME TEXT IN IT
// that works ok but let's try cg to control color
UIGraphicsPushContext(cgContext);
UIFont *helv = [UIFont fontWithName:@"Helvetica" size:[UIFont systemFontSize]];
NSString* msg = @"Hi hello" ;  
[msg drawInRect:CGRectMake(0,0,pow2Width,pow2Height) withFont:helv] ;
    UIGraphicsPopContext();
*/

// put imData into OpenGL's memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pow2Width, pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imData);
CHECK_GL ;
它看起来很好,而且抗锯齿


ios字体的列表是,我用

创建了一个类似于“musings”字体库的字体类,减去内存泄漏和每个字符、每个帧的纹理创建。但它仍然为每个角色使用不同的纹理。注意:Texture2D已更改为注释掉其纹理删除

构造函数中的初始化:
\u font=新字体(“Helvetica”,40)

在redraw()方法中使用:
\u font->draw(“你好,世界!”,50,100,左对齐)

GitHub链接:


我想这不是我想要的。我相信这会动态地为整个字符串创建纹理,这是一个CPU密集型操作。寻找更多的方法来从单个四边形构造单词,这样我就可以在运行时呈现任意文本。这应该快得多。为什么你认为你建议的方法会更快?你不能在没有纹理的情况下绘制视图——它不会运行得很快。这个结构肯定能帮助我理解所有涉及的步骤。非常感谢。我如何生成t
font.print(x, y, z) << "fps: " << fps;
// Create the cgcontext as shown by links above

// Now to render text into the cg context,
// the drop the raw data behind the cgcontext
// to opengl.  2 ways to do this:
// 1)  CG* way: (advantage: easy to use color)
CGContextSelectFont(cgContext, "Arial", 24, kCGEncodingMacRoman);

// set color to yellow text
CGContextSetRGBFillColor(cgContext, 1, 1, 0, 1) ; // Be sure to use FILL not stroke!

// draw it in there
CGContextShowTextAtPoint(cgContext, 20, 20, "HI THERE", strlen("HI THERE") ) ;

/*
// WAY #2:  this way it's always black and white
// DRAW SOME TEXT IN IT
// that works ok but let's try cg to control color
UIGraphicsPushContext(cgContext);
UIFont *helv = [UIFont fontWithName:@"Helvetica" size:[UIFont systemFontSize]];
NSString* msg = @"Hi hello" ;  
[msg drawInRect:CGRectMake(0,0,pow2Width,pow2Height) withFont:helv] ;
    UIGraphicsPopContext();
*/

// put imData into OpenGL's memory
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, pow2Width, pow2Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imData);
CHECK_GL ;