Вопрос по opengl-es, iphone, retina-display – Гениально - спасибо. Это исправляет это :-)

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/2 от того, что должно быть.

Есть идеи?

Ваш Ответ

1   ответ
11

а не в пикселях. Когда масштабный коэффициент применяется к 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);
}

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

Похожие вопросы