OpenGL ES推荐的显示背景图像的方法

时间:2010-02-16 21:51:36

标签: iphone opengl-es

推荐使用OpenGL ES应用程序显示背景图像的方法。

  1. UIImage添加到glview下的查看层次结构?
  2. 从内存中的纹理在OpenGL绘制例程中绘制的图像?
  3. 是否需要考虑性能/内存因素?

2 个答案:

答案 0 :(得分:3)

我喜欢使用Apple的Texture2D类加载纹理。创建一个四边形(两个三角形,六个顶点),映射到屏幕的角落。然后将纹理坐标映射到顶点,将其传递给glDrawArrays并转到。我实际上有一个Class,它在CG坐标中取一个帧,将其转换为OpenGL坐标,然后在帧中绘制图像。

假设您有这样的结构:

struct {
  GLfloat x;             // OpenGL X Coordinate
  GLfloat y;             // OpenGL Y Coordinate
  GLfloat z;             // OpenGL Z Coordinate
  GLfloat s;             // Texture S Coordinate
  Glfloat t;             // Texture T Coordinate
} vertexData;

这样的顶点数据数组:

struct vertexData verts[6];

你有一个Texture2D对象:

 texture = [[Texture2D alloc] initWithImage:[UIImage imageNamed:image] filter:filter pixelFormat:pixelFormat];

所以,现在你必须填写顶点数组。假设x,x范围[-1,1]和y范围[-1,1],z的原点,那么你会像这样初始化你的顶点:

verts[0].x = verts[1].x = verts[5].x = -1.0;
verts[2].x = verts[3].x = verts[4].x = 1.0;

verts[0].y = verts[2].y = verts[4].y = 1.0;
verts[1].y = verts[3].y = verts[5].y = -1.0;

verts[0].z = verts[1].z = verts[2].z = 0.0;
verts[3].z = verts[4].z = verts[5].z = 0.0;

verts[0].s = verts[1].s = verts[5].s = tlxf;
verts[2].s = verts[3].s = verts[4].s = trxf;

verts[0].t = verts[2].t = verts[4].t = ttyf;
verts[1].t = verts[3].t = verts[5].t = tbyf;

最后,你需要绘制:

glBindTexture(GL_TEXTURE_2D, texture.name);
glVertexPointer(3, GL_FLOAT, sizeof(struct vertexData), &verts[0].x);
glTexCoordPointer(2, GL_FLOAT, sizeof(struct vertexData), &verts[0].s);
glDrawArrays(GL_TRIANGLES, 0, 6);

我遗漏了有关设置OpenGL的任何细节。如果你走得这么远,我假设你已经做到了。

在OpenGL中工作时需要考虑大量的性能和内存限制,但我不建议过于担心它们。一旦你运行它,用OpenGL仪器对它进行分析,看看是否有任何性能问题,然后处理它们。

Apple有一篇非常好的文档描述了最佳实践,并且在SO上也有一些有用的问题。我相信一旦你知道你遇到了什么(如果有的话),你就可以搜索它们。

答案 1 :(得分:1)

glDrawTexOES是最佳选择。