OPENGL ES 2.0在屏幕上呈现文本

时间:2011-06-07 14:44:30

标签: iphone ios text opengl-es opengl-es-2.0

我目前正在开发OPENGL ES 2.0项目。我正在制作条形图应用程序。我在制作图表方面取得了成功。我想在图表上插入文字。我发现没有直接的解决办法来实现同样的目标。

我遇到了OPENGL ES 1.1代码,其中包含以下几行。

文件:在GLViewController.m中(来自drawView函数)

Texture2D *textTex = [[Texture2D alloc] initWithString:@"Text" 

                                            dimensions:CGSizeMake(100., 40.0) 

                                             alignment:UITextAlignmentCenter 

                                                  font:[UIFont boldSystemFontOfSize:10.0]];

[textTex drawAtPoint:CGPointMake(160.0, 100.0) depth:-1];

在Texture2D.m文件中,

- (void) drawAtPoint:(CGPoint)point depth:(CGFloat)depth

{

GLfloat coordinates[] = {

0, _maxT,

_maxS, _maxT,

0, 0,

_maxS, 0

};

GLfloat width = (GLfloat)_width * _maxS,

height = (GLfloat)_height * _maxT;

GLfloat vertices[] = {

-width / 2 + point.x, -height / 2 + point.y, depth,

width / 2 + point.x, -height / 2 + point.y, depth,

-width / 2 + point.x, height / 2 + point.y, depth,

width / 2 + point.x, height / 2 + point.y, depth

};

glBindTexture(GL_TEXTURE_2D, texture.name);

glVertexPointer(3, GL_FLOAT, 0, vertices);          //1

glTexCoordPointer(2, GL_FLOAT, 0, coordinates);      //2

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

}

当我尝试将此代码转换为OPENGL ES 2.0代码时,我无法为标记为1和2的行找到合适的转换。有人可以帮我将此代码转换为OPENGL ES 2.0代码吗?

如果有人知道在屏幕上写文字的简单方法,请告诉我。

1 个答案:

答案 0 :(得分:2)

OpenGL ES 1.x和2.x在几何方面分享了很多概念。您指定顶点,然后使用几何体将它们连接起来,几何体将变为像素。不同之处在于您在两个位置指定自定义代码:获取输入几何图形并确定它在屏幕上的位置以及它通过管道传递的内容,并根据即将发布的信息确定单个片段的颜色沿着管道。

因为ES 1.x在这个意义上不可编程,所以它在两个地方都有固定的功能。这意味着固定数据结构,以及您通过glVertexPointerglTexCoordPointer等提供数据的原因。您正在为OpenGL在描述顶点时编写的固定预定字段提供值。 / p>

因为ES 2.x是完全可编程和极简主义的,所以它不会假设哪些字段描述顶点,因此没有特殊的案例数据提供方法,例如一个提供位置(glVertexPointer),另一个提供提供纹理坐标(glTexCoordPointer)等

在ES 2.x中,您使用glVertexAttribPointer替换所有固定含义的ES 1.x调用。第一个参数标识您通过索引指定的属性,该索引是由您自己通过glBindAttribLocation强制执行的,或者通过glGetAttribLocation自行查明并请求回来。

你还需要编写一个合适的片段和像素着色器,主要是为了传递你指定的纹理坐标,并对每个像素的纹理进行采样,然后传递它。每个人的身体应该只有一两行。

可能你有一些框架来处理你的图形中的这些东西。因为ES 2.x对于属性是如此通用,所以应该可以重用相同的东西。