Cómo crear el framebuffer 1536×2048 para iPad Retina sample (GLGravity)

Entonces, por supuesto, lo primero que bash en mi nuevo iPad (4g) es el antiguo ejemplo de GLGravity . La única modificación que he realizado es configurar el dispositivo de destino como "iPad".

Sin embargo, cuando se ejecuta en el dispositivo, los límites de UIView se establecen en 768,1024, al igual que el "backingWidth, BackingHeight" en createFramebuffer.

La observación de la image confirma que todavía se representa a 768×1024. ¿Qué me he perdido? ¿Cómo obtengo esto para renderizar en resolución nativa?

Para habilitar el soporte condicional para los charts de Retina, como lo hicimos para el iPhone 4, debería tener una línea de código como esta en algún lugar de la configuration para su vista de alojamiento de OpenGL ES (GLGravityView, en este caso):

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

Esto asegura que el contenido dentro de esa vista (como el dibujo de Quartz ) se muestre con la escala de 2 píxeles por punto utilizada en las pantallas actuales de Retina en el iPhone y el iPad.

Los límites de su vista se mantendrán en el tamaño de 768 x 1024 puntos, pero el búfer de representación devolverá 1536 x 2048 como dimensiones de píxeles cuando es consultado por glGetRenderbufferParameterivOES() . Esto le permitirá representar charts a nivel Retina dentro de su context de OpenGL ES.

Tenga en count que algunos de los códigos de ejemplo de Apple (como GLGravity) utilizan los límites de vista para dimensionar otros elementos de visualización , por lo que aparecerán muy pequeños en la escena. Es posible que deba replace los cálculos basados ​​en los límites de la vista (en puntos) con el ancho de respaldo (en píxeles) para asegurarse de tener en count la escala 2.0 de los charts Retina.

Como ampliación de esta respuesta , la muestra GLGravity necesita otro cambio para garantizar que la vista GL esté configurada correctamente. Esto se debe a que la propiedad de bounds devuelve los puntos de cuarzo, no los píxeles.

 -(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); ... } 

Tuve el mismo problema: @ 2 imágenes de ipad presentes, pero todo hace que @ 1x en el nuevo iPad. iPhone / iPod Touch funciona bien en dispositivos retina y no retina. Buscando en los foros de Apple dev encontré el problema: todavía estoy en Xcode 4.2, construyendo para iOS 5.0. Este sistema operativo no prevé la posibilidad de un ipad retina. Entonces necesito build con 5.1.

Creo que tipo de get esto.

Los files XIB miden en pts , no en píxeles. Un pt es una unidad de distancia, como un cm o un año luz . Un píxel no es una unidad de distancia, significa "elemento de image". Los diferentes dispositivos pueden tener diferentes densidades de píxeles.

Su file XIB le dice al tamaño de su área de visualización en pts . Aplicaciones de iPhone por defecto a 320×480 pts , iPad 768×1024 pts . Puede consultar esto en su file xib.

Ahora, self.contentScaleFactor que Brad se refiere es la respuesta . Lo que hace este valor es: "convertir desde el espacio de coorderadas lógicas pnetworkingeterminado (768×1024 puntos ) en el espacio de coorderadas del dispositivo de esta pantalla (1536×2048 px )".

En otras palabras, self.contentScaleFactor es una medida de píxeles / pt utilizada por el dispositivo. Este valor varía naturalmente de un dispositivo a otro. XCode tiene que especificar elementos de interfaz de usuario en pts (unidad de distancia del mundo real), por lo que las cosas no aparecen atornilladas en diferentes resoluciones.

Incluso puede configurar self.contentScaleFactor=4 , que en realidad parece un poco genial ( self.contentScaleFactor=4 ) (pero puede ejecutarse lentamente).

Otro problema aquí es que los events táctiles siempre estarán en pts , nunca en píxeles. Es decir, los dispositivos retina aún solo resuelven los events táctiles en una escala 768×1024.

Por lo tanto, si su vista admite la selección táctil, debe multiplicar cada evento táctil entrante por self.contentScaleFactor para que la location entrante en pts se self.contentScaleFactor a píxeles en su framebuffer.