iPhoneФорумПрограммирование

iOS SDK работа с OpenGL ES 1.1. Отображение текстур.

#0
0:17, 15 фев 2011

Здравствуйте уважаемые форумчане. Я новичок в области работы с 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

#1
11:13, 15 фев 2011

Хз... на первый взгляд нормально. С дебагой виднее. Вот источник того тутора и там в конце линк на проект.

#2
11:35, 15 фев 2011

О, спасибо большое за ссылку, а то у моего туториала все линки на исходную статью и проект битые. Вечером попробую поковырять исходник.

iPhoneФорумПрограммирование

Тема в архиве.