поддержка openGL ES Retina

Я пытаюсь запустить приложение примера кода avTouch на дисплее Retina. Кто-нибудь это сделал?

В классе 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 по-прежнему составляет половину того, что должно быть.

Любые идеи?


person Bryan    schedule 21.12.2010    source источник


Ответы (1)


Рамки указываются в точках, а не в пикселях. Когда масштабный коэффициент применяется к UIView, на котором размещается ваш CAEAGLLayer, он будет удваивать пиксели, но размер его точки кадра останется прежним.

Если вы посмотрите на ширину и высоту подложки для буфера цветного рендеринга, прикрепленного к 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 половинного размера.

Чтобы исправить это, замените соответствующий раздел в _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);
}

Это заставит все работать в соответствующем пространстве пикселей и приведет к четкому рендерингу с правильным размером в эквалайзере. Я отправил отчет об ошибке по этому поводу.

person Brad Larson    schedule 22.12.2010
comment
Но разве Retina-дисплей не удваивает размер кадра, чтобы учесть более высокое разрешение? Даже после добавления кода, который я упомянул, я все еще получаю только метр, который составляет половину высоты. Это относится только к счетчику openGL. Измеритель UIView отлично работает с сетчаткой. Я в тупике. - person Bryan; 22.12.2010
comment
@Bryan - Глядя на пример кода avTouch, кажется, что Apple допустила ошибку в способе реализации _drawView в GLLevelMeter. Они используют границы представления в точках для определения размеров вещей в OpenGL, тогда как вместо этого они должны использовать переменные экземпляра _backingWidth и _backingHeight. Замените ссылки на размер и высоту границ на _backingWidth и _backingHeight, и они будут правильно отображаться на дисплее Retina. Я отправлю отчет об ошибке в образце кода. - person Brad Larson; 22.12.2010
comment
@Bryan - Я локализовал код, который нужно изменить в редактировании моего ответа. - person Brad Larson; 22.12.2010
comment
Потрясающий. Большое спасибо. Я новичок в openGL и думал, что фрейм отрегулирован на основе contentScaleFactor, но явно нет. Еще раз спасибо! - person Bryan; 22.12.2010