在OpenGL ES应用程序中显示背景图像的推荐方法是什么?
- 将UIImage添加到glview下面的视图层次结构中?
- 从内存中的纹理绘制OpenGL绘制例程中的图像?
有没有需要考虑的性能/内存问题?
我喜欢使用苹果的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);
glDrawTexOES 是最佳的选择。