поддержка сетчатки OpenGL ES - PullRequest
       34

поддержка сетчатки OpenGL ES

6 голосов
/ 22 декабря 2010

Я пытаюсь запустить приложение примера кода 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/2 от того, что должно быть.

Есть идеи?

1 Ответ

11 голосов
/ 22 декабря 2010

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

Если вы посмотрите на ширину и высоту подложки для прикрепленного цветового рендерингадля CAEAGLLayer, используя код, подобный следующему:

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

вы должны увидеть, что ширина и высота рендеринга буфера на дисплее Retina в два раза больше значений, которые они имеют на стандартном дисплее iPhone.

Код, который вы показываете выше, должен вызывать хороший, четкий рендеринг на дисплее Retina.

РЕДАКТИРОВАТЬ (22/12/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);
}

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

...