如何在OpenGL ES for iphone中加载和显示图像

时间:2010-08-02 11:09:35

标签: iphone objective-c opengl-es textures sprite

我是新手,并尝试使用OpenGL ES在我的iPhone屏幕上显示精灵。 我知道使用cocos2d可以更简单,更容易,但现在我正在尝试直接在OpenGL上编码。 是否有任何简单而有效的方法来加载和显示OpenGL ES中的精灵。到目前为止我发现的东西要复杂得多。 :(

2 个答案:

答案 0 :(得分:16)

以下是从bundle中加载png的一些代码:

UIImage* image = [UIImage imageNamed:@"PictureName.png"];
GLubyte* imageData = malloc(image.size.width * image.size.height * 4);
CGContextRef imageContext = CGBitmapContextCreate(imageData, image.size.width, image.size.height, 8, image.size.width * 4, CGColorSpaceCreateDeviceRGB(), kCGImageAlphaPremultipliedLast);
CGContextDrawImage(imageContext, CGRectMake(0.0, 0.0, image.size.width, image.size.height), image.CGImage);
CGContextRelease(imageContext); 

以下是使用该图像数据创建纹理的一些代码。

GLuint texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image.size.width, image.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

以及如何呈现此内容的示例:

glBindTexture(GL_TEXTURE_2D, texture);
glVertexPointer(2, GL_FLOAT, 0, vertices);
glNormalPointer(GL_FLOAT, 0, normals);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4)

在这里,你需要找到适合你需要的顶点,法线和纹理线的值。

更新1

请记住设置正确的状态:

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

如果您使用glOrthof(见下文)在应用中设置2D投影,则可以使用以下值:

GLfloat vertices[] = {
   -1.0, 1.0,
   1.0, 1.0,
   -1.0, -1.0,
   1.0, -1.0, }; 

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 }; 

GLfloat textureCoords[] = {
   0.0, 0.0,
   1.0, 0.0,
   0.0, 1.0,
   1.0, 1.0 };

更新2

这是我在使用上面的代码渲染精灵时坐在投影模式的方式:

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(-5.0, 5.0, -7.5, 7.5, -1, 1);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity(); 

这就是我设置混合功能的方法。这允许png文件的透明度:

glEnable(GL_TEXTURE_2D);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

答案 1 :(得分:4)

我建议查看Apple的GLSprite示例应用程序。这正是这个应用程序的作用。

如果要加载PVRTC压缩纹理,请查看其PVRTextureLoader示例。我在我为我的iPhone类编写的sample application中使用了此代码。