Добавление поддержки дисплея retina приводит к тому, что OpenGL ES ничего не рисует
У меня есть приложение, которое рисует сцену в OpenGL ES 2.0. Все правильно отображается в симуляторах iPhone и iPad, а также на реальных устройствах, пока я не пытаюсь использовать дисплей retina. Устройства Retina по-прежнему рисуют, но с тем же разрешением, что и старые устройства.
На новых устройствах я получаю только черный экран. На симуляторах сетчатки я получаю розовый экран. Программа даже не будет использовать значение, которое я установил с помощью glClearColor ();
Я могу правильно установить масштабный коэффициент для устройства со следующим кодом:
_eaglLayer = (CAEAGLLayer *)self.layer;
_eaglLayer.opaque = YES;
self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];
И я могу правильно создать буфер визуализации здесь:
glGenRenderbuffers(1, &_depthRenderBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, _depthRenderBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, self.frame.size.width, self.frame.size.height);
//Context is an instance of EAGLContext
[_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer];
Я устанавливаю размер видового экрана следующим образом:
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_WIDTH, &_backingWidth);
glGetRenderbufferParameteriv(GL_RENDERBUFFER, GL_RENDERBUFFER_HEIGHT, &_backingHeight);
...
glViewport(0, 0, _backingWidth, _backingHeight);
Весь этот код работает на старых устройствах, и он работает безупречно, если я закомментирую строки:
self.contentScaleFactor = [[UIScreen mainScreen] scale];
_eaglLayer.contentsScale = [[UIScreen mainScreen] scale];
Я записал масштаб по мере загрузки вида, и он правильно устанавливает значение 2.0 на устройствах retina или 1.0 на старых устройствах.
Я испробовал несколько различных решений и методов. установки коэффициента масштабирования, но безрезультатно. Я знаю, что есть что-то, чего я просто не вижу, но я не могу найти это. Предложения?
2 ответа:
Я столкнулся с той же проблемой. Вызов
eaglLayer.contentsScale = [[UIScreen mainScreen] scale];
не требуется, и вы должны умножить размеры кадра с масштабом экрана. Таким образом, решение вашей проблемы будет следующим:CGFloat screenScale = [UIScreen mainScreen].scale; glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, CGRectGetWidth(self.bounds) * screenScale, CGRectGetHeight(self.bounds) * screenScale);
Кто-то еще упомянул, что звонок игллайеру.contentsScale не нужен, Но по какой-то причине это работает только тогда, когда я его называю. Я использую следующий код в подклассе UIView, и рендеринг прекрасно работает на всех устройствах:
CGFloat scale = [[UIScreen mainScreen] scale]; _eaglLayer.contentsScale = scale; [_context renderbufferStorage:GL_RENDERBUFFER fromDrawable:_eaglLayer]; CGSize s = self.frame.size; glViewport(0, 0, s.width * scale, s.height * scale);