2011-01-27 80 views
2

有人可以解释一下如何在OpenGL ES视图上渲染背景图像吗?从设置OpenGL环境的基础知识。我在这里是OpenGL的新手。解释OpenGL ES背景图像的工作原理

seeing计算器上一few问题/ answers有关创建背景图像,但我试图修改目前(苹果GLPaint尤其是)现有的代码,而我不知道需要什么,什么不是。尝试了解决方案后,我没有成功,我认为我应该退后一步,真正尝试并理解正在发生的事情。 (

是否有任何简单的应用程序显示这个?或参考手册也将是有用的(最好是新手) - 我试图寻找this answer的参考,但我不'弄不明白=(

回答

0

我建议你阅读从一开始link此文章,如果你想了解的OpenGL ES 1.1的基础知识。也有大量的样本项目提供。

1

你需要渲染一个图像(尺寸需要是2的幂次)以opengl。

,您可以将图像放置在您的3D世界中,以便它看起来像是背景(我这样做是因为我的相机角度是固定的),或者您可以在绘制图像之前推动一些矩阵以利用glOrthof,并关闭矩阵后。

下面是一些代码,以帮助您的图像绘制到OpenGL

glPushMatrix(); 

glGenTextures(1, &texture[0]); 
glBindTexture(GL_TEXTURE_2D, texture[0]); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 

UIImage *image = [UIImage imageNamed:@"map1.jpg"]; 
if (image == nil) 
    NSLog(@"Do real error checking here"); 

GLuint width = CGImageGetWidth(image.CGImage); 
GLuint height = CGImageGetHeight(image.CGImage); 
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
void *imageData = malloc(height * width * 4); 
CGContextRef context = CGBitmapContextCreate(imageData, width, height, 8, 4 * width, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big); 
CGContextTranslateCTM (context, 0, height); 
CGContextScaleCTM (context, 1.0, -1.0); 
CGColorSpaceRelease(colorSpace); 
CGContextClearRect(context, CGRectMake(0, 0, width, height)); 
CGContextTranslateCTM(context, 0, height - height); 
CGContextDrawImage(context, CGRectMake(0, 0, width, height), image.CGImage); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData); 

CGContextRelease(context); 

free(imageData); 
[image release]; 

static const GLfloat texCoords[] = { 
    0.0, 1.0, 
    1.0, 1.0, 
    0.0, 0.0, 
    1.0, 0.0 
}; 

glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 


glEnableClientState(GL_VERTEX_ARRAY); 
glEnableClientState(GL_NORMAL_ARRAY); 
glEnableClientState(GL_TEXTURE_COORD_ARRAY); 

static const GLfloat vertices[] = { 
    -1.0, 1.0, -0.0, 
    1.0, 1.0, -0.0, 
    -1.0, -1.0, -0.0, 
    1.0, -1.0, -0.0 
}; 
static const GLfloat normals[] = { 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0, 
    0.0, 0.0, 1.0 
}; 

glBindTexture(GL_TEXTURE_2D, texture[0]); 
glVertexPointer(3, GL_FLOAT, 0, vertices); 
glNormalPointer(GL_FLOAT, 0, normals); 
glTexCoordPointer(2, GL_FLOAT, 0, texCoords); 
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

glPopMatrix(); 
+0

注意,纹理尺寸不需要两个iOS设备上支持OpenGL ES 2.0的支持非是权力,或1 -power-of-two扩展:http://stackoverflow.com/questions/4760174/rendering-to-non-power-of-two-texture-on-iphone/4761453#4761453 – 2011-01-27 22:49:39