2011-02-03 15 views
6

Stavo cercando di fare in modo che la mia app OPENGL ES supporti il ​​display retina. Ho aggiunto l'immagine con l'estensione @ 2x e reso il fattore contentale a 2. L'immagine ad alta risoluzione viene visualizzata correttamente sullo schermo ma subisce una grande perdita di qualità. I bordi e lo sfocato e non ha la qualità dell'immagine che ho aggiunto nella cartella delle risorse.Problema di qualità dell'immagine del display Retina

Come posso risolvere questo?

+0

hai testarla sul dispositivo retina reale o simulatore? – Max

risposta

5

La mia app si basa sul framework predefinito e ho riscontrato questo problema durante l'esecuzione su un dispositivo basato su Retina. Nello specifico il mio framebuffer veniva creato a 320x480 anziché a 640x960 come volevo. Spiacente, ma questo NON è automatico perché il problema è con il framebuffer creato da renderBufferStorage:fromDrawable: (che chiama glRenderbufferStorage per nostro conto ma specifica i pixel di layout piuttosto che i pixel nativi del dispositivo per larghezza e altezza per impostazione predefinita).

ho aggiunto il seguente codice sotto riga righe che ha fissato eaglLayer.drawableProperties in initWithCoder: in EAGLView.m:

UIScreen *mainScreen = [UIScreen mainScreen]; 
if ([mainScreen respondsToSelector:@selector(scale)]) 
{ 
    // iOS 4.0 and up (further to simeon's comment) 
    const CGFloat scale = mainScreen.scale; 
    self.contentScaleFactor = scale; 
    eaglLayer.contentsScale = scale; 
} 

Grazie a David Amador di post per avermi nella giusta direzione . Grazie, più recentemente, ai commenti utili di simeon.

+0

Non suggerirei di verificare esplicitamente le dimensioni della retina in quanto ciò non funziona in tutti i casi (ad es. Retina iPad). Vedere la mia risposta di seguito per una soluzione più generale che utilizza il fattore di scala dello schermo. – simeon

+0

Grazie mille. Ora, in qualche modo tardivamente, corretto! :) –

+0

Non hai bisogno del ramo 'else' perché non ci sono dispositivi pre-iOS 4.0 della retina, quindi se mainScreen non risponde al selettore' scale', puoi essere certo che non è retina. – simeon

-1

OpenGLES sarà reso automaticamente con la massima risoluzione possibile sul display retina (dato che hai impostato la vista sulla larghezza e l'altezza dello schermo, ecc. Ecc.), Quindi il problema deriva dal rendering OpenGL.

OpenGLES non si cura del suffisso @ 2X che è stato aggiunto all'immagine (questo è per i framework Cocoa Touch). Tuttavia, si preoccupa della risoluzione dell'immagine. Per i migliori risultati, dovresti usare immagini quadrate che sono una larghezza e un'altezza che è una potenza di due (ad esempio 1024, 2048 ecc.).

È necessario assicurarsi che quando si carica il texure in OpenGLES si stia utilizzando il formato immagine corretto e che non lo si comprima in alcun modo.

L'altra cosa da sperimentare sono i parametri di trama. Ad esempio:

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); 

Spero che questo ti punti nella giusta direzione.

+0

Ciao grazie per l'aiuto. Ma anche dopo aver provato quello che hai detto, non mostra la qualità. Puoi per favore dirmi come sapere se l'immagine è compressa o no? Otterrò risultati migliori se uso Multisampling ?? – Aaron

+0

Puoi aggiungere del codice alla tua domanda che ti fornisce il modo in cui carichi la trama in OpenGLES? Non penso che otterrai risultati migliori se usi il multicampionamento (questo è più di un'ottimizzazione). –

1

Nel vostro EAGLView.m initWithCoder: metodo, aggiungere il seguente codice:

if([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) 
{ 
    self.contentScaleFactor = [[UIScreen mainScreen] scale]; 
} 
Problemi correlati