iOS / openGL ES - Кажется, что переопределение drawRect делает функцию openGL "glGetRenderbufferParameterivOES" неправильной? - PullRequest
2 голосов
/ 05 августа 2011

Я довольно новичок в openGL, и я пробовал некоторые примеры кодов из книги о программировании игр на iphone, которую я сейчас читаю. Одним из примеров была трехмерная игра, и я смог успешно скомпилировать и запустить ее на симуляторе iOS (во весь экран).

Проблема, с которой я столкнулся, заключается в том, что, когда я запускаю его на реальном оборудовании (ipod touch 4G), игра не выходит на полный экран (она занимает только 1/4 экрана). Я смог сузить проблему до кода ниже:

GLint backingWidth, backingHeight;

- (BOOL) bindLayer
{
....

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth);

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight);

....
}

По какой-то причине backingWidth и backingHeight установлены на 640 и 960 соответственно после вышеуказанных вызовов (я ожидал, что это будет 320 x 480, что является размером экрана iphone). На симуляторе iOS и старом ipod touch (2g) он работает просто отлично.

Приведенный выше код является частью объекта, который подклассов UIView, и переопределяет метод drawRect (хотя он пуст). Меня поразило то, что когда я удалил метод drawRect (следовательно, не переопределяя его), он каким-то образом решил проблему, описанную выше.

Может кто-нибудь пролить свет на это? Разве не безопасно переопределить метод drawRect представления, когда вы рисуете в openGL? Почему он работает на симуляторе и старом Ipod Touch?

1 Ответ

4 голосов
/ 05 августа 2011

Вы видите артефакт из-за различий в точках и пикселях на более новом устройстве с дисплеем Retina.Как я описываю в своем ответе здесь , UIKit выполняет определение размера с использованием точек, которые имеют отображение 1: 1 на пикселях на старых устройствах, но теперь имеют отображение 1: 2 на текущих дисплеях Retina.

Вместо этого OpenGL ES использует пиксели для своих измерений, поэтому при запросе размера подложки вы видите, что возвращается 640x960.Это размер, который следует использовать для области просмотра для вашей сцены OpenGL ES.

Я предполагаю, что где-то в коде, который вы пытаетесь запустить, это то, что устанавливает область просмотра для вашей сцены OpenGL ES набудет размер в точках вашего вида или слоя, а не соответствующий размер в пикселях.Это приводит к тому, что оно уменьшается до одной четверти представления, как это произошло в случае моего связанного ответа выше.Найдите glViewPort() и связанные вызовы и убедитесь, что они используют ширину и высоту подложки, а не вид или ширину и высоту слоя.

-drawRect: не должно иметь к этому никакого отношения, если только где-тотам есть код для настройки размера области просмотра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...