OpenGL ES 视网膜屏支持

6
我正在尝试在视网膜显示屏上运行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;

它将contentScaleFactor设置为“2”。很好,这是预期的。但是在layoutSubviews中,CALevelMeter的框架仍然是它应该是的一半。

有什么想法吗?

1个回答

11

帧的度量单位是点(points),而非像素(pixels)。当在UIView上应用比例因子时,它将成为原来的两倍像素,但其框架点大小不会改变。

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

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

如果你在Retina显示器上查看渲染缓冲区的宽度和高度,你会发现它们是标准iPhone显示器上的两倍。

你展示的代码应该可以在Retina显示器上产生清晰的渲染效果。

编辑(12/22/2010):针对你进一步提出的问题,查看avTouch示例代码可知,该代码的当前版本在查找OpenGL托管视图的边界时犯了错误,而没有使用渲染缓冲区的后备宽度和高度。在非1.0比例因子下,这将导致OpenGL内容绘制为一半大小。

为了解决这个问题,请在GLLevelMeter中的_drawView中用以下代码替换相应的部分:

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

这将导致所有内容在适当的像素空间中工作,并在均衡器中以正确大小进行清晰渲染。我已经在此问题上提交了错误报告。


但是视网膜显示屏不会将帧大小加倍以适应更高的分辨率吗?即使添加了我提到的代码,仪表的高度仍然只有一半。这只发生在OpenGL仪表上。UIView仪表在视网膜下工作正常。我被难住了。 - Bryan
1
@Bryan - 查看avTouch示例代码,似乎苹果在GLLevelMeter中实现_drawView的方式上存在错误。他们使用视图的边界(以点为单位)来确定OpenGL中物体的大小,而应该使用_backingWidth和_backingHeight实例变量。将对bounds大小和高度的引用替换为_backingWidth和_backingHeight,这样可以在Retina显示屏上正确绘制。我会在示例代码中提交一个错误报告。 - Brad Larson
@Bryan - 我已经定位到需要在我的答案中进行更改的代码。 - Brad Larson
太棒了。非常感谢。我是OpenGL的新手,一直以为帧根据contentScaleFactor进行调整,但显然不是这样。再次感谢! - Bryan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接