Добавление поддержки дисплея 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 4

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