Как создать кадровый буфер 1536x2048 для образца iPad Retina (GLGravity) - PullRequest
7 голосов
/ 19 марта 2012

Итак, первое, что я пробую на своем новом iPad (4g), это старый GLGravity пример. Единственная модификация, которую я сделал, - установить целевое устройство на «iPad».

Однако при работе на устройстве границы UIView устанавливаются на 768 1024, как и «backingWidth, backingHeight» в createFramebuffer.

Глазное изображение подтверждает, что оно по-прежнему отображается в 768x1024. Что я пропустил - как я могу сделать это для рендеринга в собственном разрешении?

Ответы [ 4 ]

7 голосов
/ 19 марта 2012

Чтобы включить условную поддержку графики Retina, как мы это делали для iPhone 4, вам потребуется строка кода, подобная этой, где-то в настройке для вашего представления хостинга OpenGL ES (в данном случае GLGravityView):

self.contentScaleFactor = [[UIScreen mainScreen] scale];

Это гарантирует, что содержимое в этом представлении (например, Кварцевый рисунок ) будет отображаться с масштабированием 2 пикселя на точку, используемым в текущих дисплеях Retina на iPhone и iPad.

Границы вашего вида останутся с размером точки 768 x 1024, но буфер рендеринга вернет 1536 x 2048 в качестве размеров в пикселях при запросе glGetRenderbufferParameterivOES(). Это позволит вам визуализировать графику уровня Retina в контексте OpenGL ES.

Обратите внимание, что в некотором примере кода Apple (например, GLGravity) используются границы представления для определения размера других элементов экрана , поэтому они будут выглядеть слишком маленькими в сцене. Возможно, вам придется заменить расчеты, основанные на границах вида (в точках), шириной подложки (в пикселях), чтобы убедиться, что масштабирование графики Retina 2.0 принято во внимание.

3 голосов
/ 20 марта 2012

В качестве дополнения к этому ответу образец GLGravity нуждается в другом изменении, чтобы убедиться, что область просмотра GL установлена ​​правильно.Это связано с тем, что свойство bounds возвращает точки кварца, а не пиксели.

-(void)setupView
{
  ...
  CGRect rect = self.bounds;
  // new code - modify the viewport dimensions.
  rect.size.width *= self.contentScaleFactor;
  rect.size.height *= self.contentScaleFactor;
  // end of new code
  glFrustumf(-size, size, -size / (rect.size.width / rect.size.height), size / (rect.size.width / rect.size.height), zNear, zFar);
  glViewport(0, 0, rect.size.width, rect.size.height);
  ...
}
0 голосов
/ 23 марта 2013

Я думаю, что получаю это.

XIB-файлы измеряются в точках , а не в пикселях. pt - это единица расстояния, например, см или световой год . Пиксель равен , а не единице расстояния, он обозначает «элемент изображения». Разные устройства могут иметь разную плотность пикселей.

Ваш XIB-файл сообщает размер вашей области отображения в точках . Для приложений iPhone по умолчанию установлено значение 320x480 pts , для iPad 768x1024 pts . Вы можете проверить это в своем xib-файле.

Теперь self.contentScaleFactor, на который Брэд ссылается , - это ответ . Значение этого значения: "преобразовать из пространства логических координат по умолчанию (768x1024 pts ) в пространство координат устройства этого экрана (1536x2048 px )."

Другими словами, self.contentScaleFactor - это показатель пикселей / пт , используемый устройством. Это значение варьируется от устройства к устройству. В XCode вы указываете элементы пользовательского интерфейса в pts (единица измерения реального мира), поэтому вещи не выглядят испорченными при разных разрешениях.

Вы даже можете установить self.contentScaleFactor=4, что на самом деле выглядит круто (это суперсэмплы) (но может работать медленно).

Еще одно замечание: события касания всегда будут в точках , а не в пикселях. То есть устройства Retina все еще разрешают события касания в масштабе 768x1024.

Итак, если ваш вид поддерживает выбор касания, вам нужно умножить каждое входящее событие касания на self.contentScaleFactor, чтобы входящее местоположение в pts отображалось в пикселей в вашем фреймбуфера.

0 голосов
/ 03 августа 2012

У меня была та же проблема: @ 2x изображения на ipad присутствуют, но на новом iPad все рендерится @ 1x. iPhone / iPod Touch работает нормально на устройствах с сетчаткой и без сетчатки. При поиске на форумах разработчиков Apple я обнаружил проблему: я все еще на Xcode 4.2, собираю для iOS 5.0. Эта ОС не предусматривает возможности сетчатки iPad. Поэтому мне нужно собрать с 5.1.

...