2010-02-16 28 views
4

在OpenGL ES应用程序中显示背景图像的推荐方式是什么?OpenGL ES推荐的显示背景图像的方式

  1. UIImage添加到视图层次下glview?
  2. 在OpenGL中绘制的图像从内存中的纹理绘制例程?

是否有任何性能/记忆考虑因素需要考虑?

+1

不要尝试渲染EAGLView下的任何东西 - 这会导致性能下降,因为EAGLView需要被标记为透明。 – Till 2010-02-25 21:22:53

回答

3

我喜欢使用Apple的Texture2D类加载纹理。创建映射到屏幕角落的四边形(两个三角形,六个顶点)。然后,将纹理坐标映射到顶点,并将其传递给glDrawArrays并继续。我实际上有一个类,它需要一个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]; 

所以,现在你必须填写顶点数组。假设3D,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工具进行分析,看看是否有任何性能问题,然后处理这些问题。

苹果有一个很好的描述最佳实践的文档,并且在SO上也有一些有用的问题。我相信,一旦你知道你的反对意见(如果有的话),你将能够搜索他们。

+1

而这一切只是为了背景图片?glDrawTexOES对于背景图片来说更方便。使用手工编码的四边形处理背景图像太过浪费。 – 2010-02-19 22:22:24

+0

您是否错过了我所说的全部包装在课程中的部分?你知道,因为绘制背景图像只是绘制图像的特例。我试图打破这一点,而不是提出整个班级。 – 2010-02-19 22:49:52

+1

“你有没有想过我说过这些都包在课堂上的部分?”有一个包装器是很好的,但是用多余的操作来纠缠OpenGL ES堆栈并不是那么好。 – 2010-02-20 11:54:00

2

glDrawTexOES是最佳选择。

+0

谢谢,OES代表什么?是针对iphone或opengl上的opengles的一般。有没有任何示例代码浮动? – PeanutPower 2010-02-16 22:15:08

+0

请参阅http://iphone-3d-programming.labs.oreilly.com/ch07.html#ch07_id35816945 上的示例请注意,“此扩展在OpenGL ES 2.0下不受支持”,因此,您需要另一个解决方案iPhone 3GS。 – 2010-02-16 22:26:37

+0

为什么是最好的选择? – 2010-02-19 22:51:33