Iphone OPENGL ES 2.0在屏幕上渲染文本
我目前正在从事OPENGL ES 2.0项目。我正在制作一个条形图应用程序。我成功地绘制了这张图表。我正在尝试在图表上插入文本。我发现没有直接的解决办法可以达到同样的效果 我遇到了一个OpenGLES1.1代码,其中有以下几行代码 文件:在GLViewController.m中(来自drawView函数) 在Texture2D.m文件中Iphone OPENGL ES 2.0在屏幕上渲染文本,iphone,ios,text,opengl-es,opengl-es-2.0,Iphone,Ios,Text,Opengl Es,Opengl Es 2.0,我目前正在从事OPENGL ES 2.0项目。我正在制作一个条形图应用程序。我成功地绘制了这张图表。我正在尝试在图表上插入文本。我发现没有直接的解决办法可以达到同样的效果 我遇到了一个OpenGLES1.1代码,其中有以下几行代码 文件:在GLViewController.m中(来自drawView函数) 在Texture2D.m文件中 - (void) drawAtPoint:(CGPoint)point depth:(CGFloat)depth { GLfloat coordinates
- (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的行的合适转换。有人能帮我把这个代码转换成OpenGLES2.0代码吗
或者,如果有人知道一种更简单的在屏幕上书写文本的方法,请告诉我。OpenGL ES 1.x和2.x在几何方面有很多相同的概念。指定顶点,然后将它们与几何体连接,几何体将转换为像素。不同之处在于您在两个地方指定了自定义代码:获取输入几何体并计算出它在屏幕上的位置以及它通过管道传递的内容,以及计算出单个片段基于管道中传递的信息的颜色 因为ES1.x在这个意义上是不可编程的,所以它在两个地方都有固定的功能。这意味着固定的数据结构,因此,您可以通过
glVertexPointer
,glTexCoordPointer
等方式提供数据。您可以为OpenGL写入stone中的固定、预定字段提供值,以描述顶点
由于ES 2.x是完全可编程且极简的,因此它不假设哪些字段描述顶点,因此没有特例数据提供方法,例如一个提供位置(glVertexPointer
),另一个提供纹理坐标(glTexCoordPointer
),等等
在ES 2.x中,您可以使用GLVERTEXAttributePointer替换所有具有固定含义的ES 1.x调用。第一个参数标识您通过索引指定的属性,该索引由您自己通过glbindattiblocation
强制执行,或者由您自己确定并通过glgetattiblocation
请求返回
您还需要编写一个合适的片段和像素着色器,基本上只需传递指定的纹理坐标,并对每个像素的纹理进行采样,然后传递。在每一行的主体中应该只有一行或两行
也许你已经有了某种框架,可以在你的图形中处理这些东西。由于ES 2.x在属性方面非常通用,因此应该可以重用几乎相同的内容。您曾经成功地做到过这一点吗?如果你能分享代码那就太好了
- (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);
}