6
votes

Retina Afficher le problème de la qualité de l'image

J'essayais de rendre mon application OpenGL ES pour prendre en charge l'affichage de la rétine. J'ai ajouté l'image avec une extension @ 2x et a effectué le facteur de contenu de la contenance à 2. L'image haute résolution apparaît correctement à l'écran, mais elle subit une grande perte de qualité. Les bords et flouent et il n'a pas de qualité d'image que j'ai ajouté dans le dossier de ressources.

Comment puis-je résoudre ce problème?


1 commentaires

avez-vous le tester sur un réel appareil de rétine ou un simulateur?


3 Réponses :


-1
votes

Les opengles seront rendus à la plus grande résolution possible de l'écran de rétine (étant donné que vous avez défini votre fenêtre sur la largeur et la hauteur de l'écran, etc., etc.) Le problème vient de votre rendu opengl.

Opengles ne se soucie pas du suffixe @ 2x Vous avez ajouté à l'image (ceci est pour les cadres tactiles de cacao). Il se soucie cependant de la résolution de l'image. Pour les meilleurs résultats, vous devez utiliser des images carrées une largeur et une hauteur qui est une puissance de deux (par exemple 1024, 2048, etc.).

Vous devez vous assurer que lorsque vous chargez le texture dans Opengles que vous utilisez le format d'image correct et que vous ne le comprimez pas de quelque manière que ce soit.

L'autre chose que vous devriez expérimenter est les paramètres de texture. Par exemple: xxx

J'espère que cela vous indique dans la bonne direction.


2 commentaires

Salut Merci pour l'aide. Mais même après avoir essayé ce que vous avez dit, ITZ ne pas montrer la qualité. Pouvez-vous s'il vous plaît dites-moi comment savoir si l'image est comprimée ou non? Vais-je obtenir de meilleurs résultats si j'utilise multisampling ??


Pouvez-vous ajouter du code à votre question qui donne à la jist de la manière dont vous chargez la texture dans les opengles? Je ne pense pas que vous obtiendrez de meilleurs résultats si vous utilisez un multi-commémoration (c'est plus d'une optimisation).



5
votes

Mon application est basée sur le cadre par défaut et je reçois ce problème lors de l'exécution d'un périphérique basé sur la rétine. Plus précisément, ma tramebuffer était créée à 320x480 plutôt que 640x960 comme je le voulais. Désolé, James, mais ce n'est pas automatique car le problème est avec la tramebuffer créé par Renderbufferstorage: Fromdrawable: (qui appelle Glrenderbufferstorage en notre nom mais spécifie des pixels de mise en page plutôt que des pixels de périphérique natifs pour la largeur et la hauteur par défaut).

J'ai ajouté le code suivant ci-dessous lignes de ligne qui définir eagllayer.drawableProperties dans initwithcoder: dans eaglview.m : xxx

Merci à David Amador's post < / a> pour me pointer dans la bonne direction. Merci, plus récemment, les commentaires utiles de Simeon.


3 commentaires

Je ne suggérerais pas de vérifier explicitement pour les dimensions de la rétine, car cela ne fonctionne pas dans tous les cas (par exemple, rétine iPad). Consultez ma réponse ci-dessous pour une solution plus générale qui utilise le facteur d'échelle de l'écran.


Vous n'avez pas besoin de la succursale sinon car il n'y a pas de périphériques de Retina Pre-iOS 4.0, de sorte que si MainsCreen ne répond pas au sélecteur échelle , vous pouvez être sûr que c'est non-rétine.


Vous soulevez un point très intéressant. Je suppose que l'API devait être introduite pour les appareils de rétine et, donc, doit être présent sur eux! Merci Siméon. Je vais mettre à jour à nouveau. :)



1
votes

Dans votre eAglView.m InitwithCoder: méthode, ajoutez le code suivant:

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


0 commentaires