3

iOS5でopengles2.0アプリを開発しています。背景としてテクスチャをペイントします。デバイスを回転させるときは、レイヤーを回転させてレイヤーのサイズを変更する必要があります。問題は、レイヤーの境界を変更できることですが、レイヤーの解像度は同じです。つまり、境界が1024 * 768のレイヤーがあり、新しいレイヤーの境界を768 * 1024として定義すると、レイヤーサイズは変更されますが、768 * 1024テクスチャを背景としてペイントすると、画像が変形します。

関数を使用しcanvasView.bounds = newCanvasRect;canvasView.frame = newCanvasRect;レイヤーサイズを変更します(canvasViewはレイヤーで、newCanvasRectは新しい境界です)。

何か案は?

4

1 に答える 1

1

デバイスが新しい高さと幅で回転するたびに、フレームバッファを破棄して再構築する必要があります。layoutsubviewsを使用して、これらすべてをトリガーします。これは、向きが変わると呼び出されます。

- (void)layoutSubviews {
   NSLog(@"layoutSubviews");
   [EAGLContext setCurrentContext:_context];
   [self destroyFramebuffer];
   [self createFramebuffer];
}


- (void)destroyFramebuffer {
   NSLog(@"destroy buffer");

   glDeleteFramebuffers(1, &viewFramebuffer);
   viewFramebuffer = 0;
   glDeleteRenderbuffers(1, &viewRenderbuffer);
   viewRenderbuffer = 0;
   glDeleteRenderbuffers(1, &depthRenderbuffer);
   depthRenderbuffer = 0;
}


- (BOOL)createFramebuffer {
   NSLog(@"creating buffer");

   glGenFramebuffers(1, &viewFramebuffer);
   glBindFramebuffer(GL_FRAMEBUFFER, viewFramebuffer);

   glGenRenderbuffers(1, &viewRenderbuffer);
   glBindRenderbuffer(GL_RENDERBUFFER, viewRenderbuffer);

   // setup the renderbuffer to the context
   [[EAGLContext currentContext] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer *)self.layer];
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_RENDERBUFFER, viewRenderbuffer);

   // Allocate color buffer backing based on the current layer size (get the current layer size)
   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &backingWidth);
   glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &backingHeight);

   NSLog(@"backing width: %d height: %d",backingWidth, backingHeight);

   // set up the depth buffer
   glGenRenderbuffers(1, &depthRenderbuffer);
   glBindRenderbuffer(GL_RENDERBUFFER, depthRenderbuffer);
   glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, backingWidth, backingHeight);
   glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, depthRenderbuffer);
   glEnable(GL_DEPTH_TEST);
   glEnable(GL_CULL_FACE);

   [self setupView];

   return YES;
}

次に、backingWidthとbackingHeightを使用して、射影行列を再作成します。

于 2013-03-23T22:53:13.357 に答える