OpenGL ES中iPhone背景纹理图像的失真绘制

OpenGL ES中iPhone背景纹理图像的失真绘制,iphone,opengl-es,textures,texture2d,Iphone,Opengl Es,Textures,Texture2d,我在iPhone应用程序中渲染背景纹理时遇到问题。以下图像显示了该问题: tojamgames.com/wp-content/uploads/2010/09/IMG_0246.png(抱歉,无法将此作为链接) 第一个是正确的图像,第二个是用OpenGL ES绘制的图像(是的,它比较小,我在照片编辑器中手动裁剪了它以删除一些游戏UI界面。不过,你可以从中非常清楚地了解失真效果)。显然,渲染纹理上的扭曲线并不理想。下面是我的代码,它可以设置opengl,加载纹理,并渲染图像-任何帮助都会很好!!抱

我在iPhone应用程序中渲染背景纹理时遇到问题。以下图像显示了该问题:

tojamgames.com/wp-content/uploads/2010/09/IMG_0246.png(抱歉,无法将此作为链接)

第一个是正确的图像,第二个是用OpenGL ES绘制的图像(是的,它比较小,我在照片编辑器中手动裁剪了它以删除一些游戏UI界面。不过,你可以从中非常清楚地了解失真效果)。显然,渲染纹理上的扭曲线并不理想。下面是我的代码,它可以设置opengl,加载纹理,并渲染图像-任何帮助都会很好!!抱歉,这很长,但我正试图提供尽可能多的信息:-P

OpenGL初始化:

glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_FASTEST);
glShadeModel(GL_FLAT);
glDisable(GL_DITHER);
glDisable(GL_LIGHTING);

glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrthof(0, screenBounds.size.width, 0, screenBounds.size.height, -1, 1);

glMatrixMode(GL_MODELVIEW);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND_SRC);
glEnableClientState(GL_VERTEX_ARRAY);

glDisable(GL_DEPTH_TEST);

glClearColor(1.0f, 1.0f, 1.0f, 0.0f);
纹理加载:

glGenTextures(1, &_name);
glGetIntegerv(GL_TEXTURE_BINDING_2D, &saveName);
glBindTexture(GL_TEXTURE_2D, _name);

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data);
绘画场景

[EAGLContext setCurrentContext:context];
glBindFramebufferOES(GL_FRAMEBUFFER_OES, viewFramebuffer);


glViewport(0, 0, screenBounds.size.width , screenBounds.size.height);

// texture images have pre-multiplied alpha, so use this blend function
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);

[backgroundImage drawAtPoint:CGPointMake(0,0)];

// more game-specific stuff you don't need to see :-P

glBindRenderbufferOES(GL_RENDERBUFFER_OES, viewRenderbuffer);
[context presentRenderbuffer:GL_RENDERBUFFER_OES];
最后,绘制图像本身(在drawAtPoint方法调用中)

再一次,抱歉,这太长了,但希望它能提供足够的信息,让别人看到我把事情搞砸了!!!非常感谢你


汤姆

看起来像色彩量化。视图的
kEAGLDrawablePropertyColorFormat
属性是否设置为
kEAGLColorFormatRGB565
?如果是这样,请查看将其更改为
kEAGLColorFormatRGBA8
是否解决了您的问题。

谢谢-结果表明,只有我在登录时才可以看到这些文件。我修复了链接。谢谢,Pivot,但是kEAGLDrawablePropertyColorFormat属性实际上是kEAGLColorFormatRGBA8。如果有帮助的话——我在iPhone模拟器上看不到这个问题,只是在一台设备上(但我测试过的所有设备,包括3G、3GS、iPad),你用什么来将PNG解码成指向glTexImage2D的数据指针?我在一些示例中使用了苹果提供的Texture2D类。我在绘图部分稍微修改了它,但是,我只是通过initWithImage:(UIImage*)方法创建纹理。它基本上根据像素格式为图像分配足够的空间,并创建CGBitmapContext并将UIImage绘制到其上。通过更仔细地查看纹理发现问题。所讨论的图像没有透明度,因此纹理2D代码试图将其解释为RGB565。继续,把一切解释成RGBA8修复的。问题不在于视图,事实上是加载数据指针-Pivot让我看到了正确的方向,所以你得到了答案:)
// grab texture coordinates - maxS & maxT are the width & height in the POT texture
// that contain our NPOT image
GLfloat  coordinates[] = {  0,  0,
_maxS,         0,
    0,  _maxT,
_maxS,         _maxT  };

GLfloat screenHeight = [[UIScreen mainScreen] bounds].size.height;

// adjust the vertices of the quad so they're contained within the bounding rect of the
// image in the game, subtracting from screenHeight to invert the OpenGL coordinate system
GLfloat vertices[] = { rect.origin.x, screenHeight - rect.origin.y, 0.0,
rect.origin.x + rect.size.width, screenHeight - rect.origin.y, 0.0,
rect.origin.x, screenHeight - (rect.origin.y + rect.size.height), 0.0,
rect.origin.x + rect.size.width, screenHeight - (rect.origin.y + rect.size.height), 0.0 };

glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);

glBindTexture(GL_TEXTURE_2D, _name);
glVertexPointer(3, GL_FLOAT, 0, vertices);
glTexCoordPointer(2, GL_FLOAT, 0, coordinates);

glEnable(GL_BLEND);

glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

glDisable(GL_BLEND);

glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);