Здравствуйте уважаемые форумчане. Я новичок в области работы с OpenGL и тем более с OpenGL ES (версия 1.1 в моем случае).
По вот этим http://lookapp.ru/2009/06/21/iphone-sdk-tutorials64/ урокам я делаю свои первые шаги по рисованию двух- и трехмерных объектов под iOS (4.2).
Но возникла проблема с отображением текстур, т.е. картинка с текстурой не отображается вообще, только квадрат с белой заливкой на который я пытаюсь ее наложить. Ниже привожу код EAGLView.m:
- (id)initWithCoder:( NSCoder*)coder { if ( ( self = [super initWithCoder:coder])) { // Get the layer CAEAGLLayer *eaglLayer = ( CAEAGLLayer *)self.layer; eaglLayer.opaque = YES; eaglLayer.drawableProperties = [NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:NO], kEAGLDrawablePropertyRetainedBacking, kEAGLColorFormatRGBA8, kEAGLDrawablePropertyColorFormat, nil]; context = [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES1]; if ( !context) { [self release]; return nil; } animationInterval = 1.0 / 60.0; rota = 0.0; [self setupView]; [self loadTexture]; } return self; } - ( void)setupView { const GLfloat zNear = 0.1, zFar = 1000.0, fieldOfView = 60.0; GLfloat size; glEnable( GL_DEPTH_TEST); glMatrixMode( GL_PROJECTION); size = zNear * tanf( DEGREES_TO_RADIANS( fieldOfView) / 2.0); // Получаем размер, соответствующий экрану iPhone CGRect rect = self.bounds; glFrustumf( -size, size, -size / ( rect.size.width / rect.size.height), size / ( rect.size.width / rect.size.height), zNear, zFar); glViewport( 0, 0, rect.size.width, rect.size.height); glClearColor( 0.0f, 0.0f, 0.0f, 1.0f); } - ( void) loadTexture { CGImageRef textureImage = [UIImage imageNamed:@"checkerplate.png"].CGImage; if ( textureImage == nil) { NSLog( @"Failed to load texture image"); return; } NSInteger texWidth = CGImageGetWidth( textureImage); NSInteger texHeight = CGImageGetHeight( textureImage); GLubyte *textureData = ( GLubyte *)malloc( texWidth * texHeight * 4); CGContextRef textureContext = CGBitmapContextCreate( textureData, texWidth, texHeight, 8, texWidth * 4, CGImageGetColorSpace( textureImage), kCGImageAlphaPremultipliedLast); CGContextDrawImage( textureContext, CGRectMake( 0.0, 0.0, ( float)texWidth, ( float)texHeight), textureImage); CGContextRelease( textureContext); glGenTextures( 1, &textures[0]); glBindTexture( GL_TEXTURE_2D, textures[0]); glTexImage2D( GL_TEXTURE_2D, 0, GL_RGBA, texWidth, texHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, textureData); free( textureData); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); glEnable( GL_TEXTURE_2D); } - ( void)drawView { const GLfloat squareVertices[] = { -0.5, 0.5, 0.0, // Верхняя левая -0.5, -0.5, 0.0, // Нижняя левая 0.5, -0.5, 0.0, // Нижняя правая 0.5, 0.5, 0.0 // Верхняя правая }; const GLshort squareTextureCoords[] = { 0, 1, // верхняя левая 0, 0, // нижняя левая 1, 0, // верхняя правая 1, 1 // нижняя правая }; [EAGLContext setCurrentContext:context]; glBindFramebufferOES( GL_FRAMEBUFFER_OES, viewFramebuffer); glViewport( 0, 0, backingWidth, backingHeight); // -- НАЧАЛО НОВОГО КОДА glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode( GL_MODELVIEW); rota += 0.5; glLoadIdentity( ); glColor4f( 1.0, 1.0, 1.0, 1.0); // НОВОЕ glRotatef( rota, 0.0, 0.0, 1.0); glVertexPointer( 3, GL_FLOAT, 0, squareVertices); glEnableClientState( GL_VERTEX_ARRAY); glTexCoordPointer( 2, GL_SHORT, 0, squareTextureCoords); // НОВОЕ glEnableClientState( GL_TEXTURE_COORD_ARRAY); // НОВОЕ glDrawArrays( GL_TRIANGLE_FAN, 0, 4); glDisableClientState( GL_TEXTURE_COORD_ARRAY); // НОВОЕ // -- КОНЕЦ НОВОГО КОДА glBindRenderbufferOES( GL_RENDERBUFFER_OES, viewRenderbuffer); [context presentRenderbuffer:GL_RENDERBUFFER_OES]; [self checkGLError:NO]; }
Может кто-то сможет подсказать, почему может не рисоваться текстура?
P.S. Размер картинки checkerplate.png 128x128
Хз... на первый взгляд нормально. С дебагой виднее. Вот источник того тутора и там в конце линк на проект.
О, спасибо большое за ссылку, а то у моего туториала все линки на исходную статью и проект битые. Вечером попробую поковырять исходник.
Тема в архиве.