2010-09-08 5 views
0

У меня возникла проблема с отображением фоновой текстуры в приложении для iPhone. Следующие изображения показывают проблему:Фоновая текстура изображения в iPhone, нарисованная с искажением в OpenGL ES

http://www.tojamgames.com/wp-content/uploads/2010/09/background_layer1.png

tojamgames.com/wp-content/uploads/2010/09/IMG_0246.png (не может сделать эту ссылку, извините)

Первый один это правильный образ, второй - тот, который был нарисован с помощью OpenGL ES (да, он меньше, я обрезал его вручную в редакторе фотографий, чтобы удалить часть интерфейса интерфейса игры. Вы можете получить представление об искажении эффект довольно ясно из этого, хотя). Очевидно, что линии искажений в визуализированной текстуре не идеальны. Вот мой код, который устанавливает 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); 

Texture Загрузка:

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

Drawing Сцена

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

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

Снова, извините, это длинный, но, надеюсь, он обеспечивает достаточно, чтобы кто-то мог видеть, где я испортился !!! Спасибо большое!

Том

+0

Обе ссылки не работают. – genpfault

+0

Спасибо - они были видны только мне во время входа в систему. Я исправил ссылки. – Tojo

ответ

0

Это похоже на квантование цвета. Свойство kEAGLDrawablePropertyColorFormat вашего вида, установленное на kEAGLColorFormatRGB565? Если да, посмотрите, измените ли его на kEAGLColorFormatRGBA8 свою проблему.

+0

Спасибо, Pivot, но свойство kEAGLDrawablePropertyColorFormat на самом деле является kEAGLColorFormatRGBA8. Если это помогает - я не вижу этой проблемы на симуляторе iPhone, просто на устройстве (но все устройства, которые я тестировал, включая 3G, 3GS, iPad) – Tojo

+0

Что вы используете для декодирования ваших PNG в указатель данных вы передаете glTexImage2D? – Pivot

+0

Я использую класс Texture2D, предоставляемый Apple в некоторых своих примерах. Я немного изменил его в разделе чертежа, но я создаю Texture только через метод initWithImage: (UIImage *). Он в основном выделяет достаточно места для изображения в соответствии с его пиксельным форматом и создает CGBitmapContext и рисует на него UIImage. – Tojo