2010-08-02 62 views
10

我是一个新手,并尝试使用OpenGL ES在我的iPhone屏幕上显示一个精灵。 我知道它更简单,更容易做到与cocos2d,但现在我试图直接在OpenGL上编码。 是否有任何简单而有效的方式来加载和显示OpenGL ES中的精灵。我到目前为止发现的情况要复杂得多。 :(如何在用于iphone的OpenGL ES中加载和显示图像

+0

哪个版本的OpenGL ES,1或2? – 2010-08-02 11:14:45

+0

我正在使用ES 1. – nomann 2010-08-02 11:15:36

回答

15

下面是一些代码从束加载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) 

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

更新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); 
+0

Thnx 4 ur tym Martin。 我一定会尝试。 :) – nomann 2010-08-02 11:32:56

+0

总是善于从任何花哨动画之前的基础开始......我也是全新的图形/ iPhone的东西......好样品。 – DRapp 2011-11-26 03:25:19

4

我建议看看苹果的GLSprite示例应用程序。这正是这个应用程序所做的。

如果你想加载PVRTC压缩纹理,请看他们的PVRTextureLoader例子。我使用我为我的iPhone课写的sample application中的代码。

相关问题