openGL ES视网膜支持

Bry*_*yan 6 iphone opengl-es retina-display

我正试图让avTouch示例代码应用程序在视网膜显示器上运行.有没有人这样做过?

在CALevelMeter类中,我尝试了以下内容:

- (id)initWithCoder:(NSCoder *)coder {
 if (self = [super initWithCoder:coder]) {
      CGFloat f = self.contentScaleFactor;
      if ([self respondsToSelector:@selector(contentScaleFactor)])
      {
           self.contentScaleFactor = [[UIScreen mainScreen] scale];
      }
      f = self.contentScaleFactor;

      _showsPeaks = YES;
      _channelNumbers = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], nil];
      _vertical = NO;
      _useGL = YES;
      _meterTable = new MeterTable(kMinDBvalue);
      [self layoutSubLevelMeters];
      [self registerForBackgroundNotifications];
 }
 return self;
Run Code Online (Sandbox Code Playgroud)

}

并将contentScaleFactor设置为"2".很好,这是预期的.但是在layoutSubviews中,CALevelMeter框架仍然是应该的1/2.

有任何想法吗?

Bra*_*son 11

帧是点,而不是像素.当比例因子应用于托管CAEAGLLayer的UIView时,它将是像素的两倍,但其帧点大小将保持不变.

如果使用以下代码查看附加到CAEAGLLayer的颜色渲染缓冲区的背景宽度和高度:

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);
Run Code Online (Sandbox Code Playgroud)

您应该看到Retina显示屏上渲染缓冲区的宽度和高度是标准iPhone显示屏上的值的两倍.

您在上面显示的代码应该会在Retina显示屏上产生漂亮,清晰的渲染.

编辑(12/22/2010):回答您的进一步问题,查看avTouch示例代码显示该代码的当前版本在查找OpenGL托管视图的边界时出错,而不是使用支持渲染缓冲区的宽度和高度.使用非1.0比例因子,这将导致OpenGL内容以一半大小绘制.

要解决此问题,_drawView请使用以下代码替换GLLevelMeter中的相应部分:

if (_vertical)
{
    glTranslatef(0., _backingWidth, 0.);
    glScalef(1., -1., 1.);
    bds = CGRectMake(0., 0., _backingWidth, _backingHeight);
} else {
    glTranslatef(0., _backingHeight, 0.);
    glRotatef(-90., 0., 0., 1.);
    bds = CGRectMake(0., 0., _backingHeight, _backingWidth);
}
Run Code Online (Sandbox Code Playgroud)

这将使所有内容在适当的像素空间中工作,并在均衡器中以正确的大小导致清晰的渲染.我已就此提交了一份错误报告.