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