lundi 6 décembre 2010

iPhone 4 - Retina Display - OpenGL (OpenGLES)

Je vais reprendre en français un article très utile qui m'a permis de convertir mon code OpenGLES pour iPhone / iPad vers l'iPhone 4 (dit Retina Display).

La création d'une vue pour l'iPhone se fait en 320 x 480, et cela même si l'iPhone 4 a une résolution double.
En réalité, iOS gère automatique le doublement du nombre de pixels mais sans changer les informations de tailles (juste grâce aux @2x qu'il faut ajouter au fichier d'image, mais ce n'est pas valable pour un code OpenGL).

Le problème est que lorsque l'on crée la vue OpenGL, cela se fait aussi en 320x480.
L'instruction glGetRenderbufferParameterivOES qui permettait de savoir si l'on tournait sur un iPhone ou un iPad n'a pas été modifié. Il retourne toujours 320 pour les iPhones, et 768 pour iPad.

Ce site web explique une façon de savoir que l'on tourne sur un iPhone 4.

Avant d'appeler glGetRenderbufferParameterivOES, il faut faire cela :


int w = 320;
int h = 480;

float ver = [[[UIDevice currentDevice] systemVersion] floatValue];
// You can't detect screen resolutions in pre 3.2 devices, but they are all 320x480
if (ver >= 3.2f)
{
    UIScreen* mainscr = [UIScreen mainScreen];
    w = mainscr.currentMode.size.width;
    h = mainscr.currentMode.size.height;
}

if (w == 640 && h == 960) // Retina display detected
{
    // Set contentScale Factor to 2
    self.contentScaleFactor = 2.0;
    // Also set our glLayer contentScale Factor to 2
    CAEAGLLayer *eaglLayer = (CAEAGLLayer *)self.layer;
    eaglLayer.contentsScale=2; //new line
}


Ainsi le contentsScale stocke l'information du doublage du nombre de pixels. Ainsi, on peut réutiliser cette info lors :
- Du gLViewport
- De touchesMoved / touchesBegan / touchesEnd (ou il faut appliquer le contentsScale sur UITouch locationInView
[touch locationInView:self].x * eaglLayer.contentsScale

Aucun commentaire:

Enregistrer un commentaire