如何在OpenGL ES for iphone中加载和显示图像 [英] How to load and display image in OpenGL ES for iphone

查看:152
本文介绍了如何在OpenGL ES for iphone中加载和显示图像的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm a newbie and trying to display a sprite on my iPhone screen using OpenGL ES. I know its far simpler and easier to do it with cocos2d but now I'm trying to code directly on OpenGL. Is there any simple yet efficient way to load and display sprites in OpenGL ES. What I've found until now is much much complex. :(

推荐答案

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

Here is some code to load a png from bundle:

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

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

Here is some code to create a texture with that image data.

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

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

And an example of how to render this:

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)

在这里你需要找到顶点的值,normals和textureCoords,符合您的需求。

Here you need to find the values of vertices, normals and textureCoords that fit your needs.

更新1

请记住设置正确的状态如下:

Remember to set the right states like this:

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

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

If you use glOrthof (See below) to set a 2D projection in your app, you can use these values:

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

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

This is how I sat the projection mode when using the above code to render sprites:

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

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

And this is how i set my blending function. This allows for transparency in the png files:

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

这篇关于如何在OpenGL ES for iphone中加载和显示图像的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆