2011-02-03 26 views
6

Estaba intentando hacer que mi aplicación OPENGL ES sea compatible con la visualización de retina. Agregué la imagen con la extensión @ 2x e hice que el factor de escala de contenido sea 2. La imagen de alta resolución aparece correctamente en la pantalla, pero sufre una gran pérdida de calidad. Los bordes y borrosa y no tiene calidad de imagen que agregué a la carpeta de recursos.Retina muestra problema de calidad de imagen

¿Cómo puedo solucionar esto?

+0

has probarlo en la retina dispositivo real o simulador? – Max

Respuesta

5

Mi aplicación se basa en el marco predeterminado y estaba recibiendo este problema cuando se ejecutaba en un dispositivo basado en Retina. Específicamente mi framebuffer se estaba creando a 320x480 en lugar de 640x960 como yo quería. Lo siento James, pero esto NO es automático porque el problema está en el framebuffer creado por renderBufferStorage:fromDrawable: (que llama a glRenderbufferStorage en nuestro nombre pero especifica los píxeles de diseño en lugar de los píxeles de dispositivo nativos para ancho y alto de manera predeterminada).

I añade el siguiente código debajo de las líneas de línea, que establece eaglLayer.drawableProperties en initWithCoder: en 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; 
} 

Gracias a David Amador de post para mí apuntando en la dirección correcta . Gracias, más recientemente, a los útiles comentarios de simeon.

+0

No recomendaría que se revisen explícitamente las dimensiones de la retina, ya que esto no funciona en todos los casos (por ejemplo, retina iPad). Consulte mi respuesta a continuación para obtener una solución más general que utiliza el factor de escala de la pantalla. – simeon

+0

Gracias simeon. Ahora, algo tardíamente, corregido! :) –

+0

No necesita la rama 'else' porque no hay dispositivos retina pre-iOS 4.0, por lo que si mainScreen no responde al selector' scale', puede estar seguro de que no retina. – simeon

-1

OpenGLES se renderizará a la mayor resolución posible en la pantalla retina automáticamente (dado que ha configurado su ventana gráfica para el ancho y alto de la pantalla, etc.) por lo que el problema proviene de su renderizado OpenGL.

A OpenGLES no le importa el sufijo @ 2X que ha adjuntado a la imagen (esto es para los marcos Cocoa Touch). Sin embargo, sí se preocupa por la resolución de la imagen. Para obtener los mejores resultados, debe usar imágenes cuadradas que tienen un ancho y una altura que es una potencia de dos (por ejemplo, 1024, 2048, etc.).

Debe asegurarse de que cuando cargue la texure en OpenGLES esté utilizando el formato de imagen correcto, y que no esté comprimiendo de ninguna manera.

La otra cosa con la que debes experimentar es con los parámetros de textura. Por ejemplo:

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

Espero que esto lo guíe en la dirección correcta.

+0

Hola gracias por la ayuda. Pero incluso después de intentar lo que dijiste, no mostraba la calidad. ¿Puedes decirme cómo saber si la imagen está comprimida o no? ¿Obtendré mejores resultados si uso Multisampling? – Aaron

+0

¿Puede agregar algún código a su pregunta que proporcione la información de cómo carga la textura en OpenGLES? No creo que obtenga mejores resultados si usa multimuestreo (esto es más una optimización). –

1

En su EAGLView.m initWithCoder: método, agregue el siguiente código:

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