Estoy tratando de resolver este problema de parpadeo en el iPhone (abrir el juego de gl). Tengo algunas imágenes que no tienen dimensiones de pow-of-2. Voy a reemplazarlos con imágenes con las dimensiones adecuadas ... pero ¿por qué las dimensiones deben ser potencias de dos?¿Por qué las imágenes para texturas en el iPhone deben tener una potencia de dos dimensiones?
Respuesta
La razón por la que la mayoría de los sistemas (incluso muchas tarjetas gráficas modernas) demandan texturas de potencia de 2 es mipmapping.
¿Qué es mipmapping?
Se crearán versiones más pequeñas de la imagen para que se vea correctamente en un tamaño muy pequeño. La imagen se divide por 2 una y otra vez para hacer nuevas imágenes.
Entonces, imagine una imagen de 256x128. Esto tendría versiones más pequeñas creadas con dimensiones de 128x64, 64x32, 32x16, 16x8, 8x4, 4x2, 2x1 y 1x1.
Si esta imagen era de 256x192, funcionaría bien hasta que llegara a un tamaño de 4x3. La siguiente imagen más pequeña sería 2x1.5, que obviamente no es un tamaño válido. Algunos hardware de gráficos pueden lidiar con esto, pero muchos tipos no pueden hacerlo.
Algunos hardware también requieren una imagen cuadrada, pero esto ya no es muy común.
¿Por qué necesita mipmapping?
Imagina que tienes una imagen que está MUY lejos, tan lejos como para tener solo el tamaño de 4 píxeles. Ahora, cuando se dibuja cada píxel, se seleccionará una posición en la imagen como el color para ese píxel. Así que terminas con 4 píxeles que pueden no ser del todo representativos de la imagen como un todo.
Ahora, imagine que la imagen se está moviendo. Cada vez que se dibuja un nuevo marco, se selecciona un nuevo píxel. Debido a que la imagen está TAN LEJOS, es muy probable que vea colores muy diferentes para pequeños cambios en el movimiento. Esto lleva a flasheo muy feo.
La falta de mipmapping causa problemas para cualquier tamaño que sea más pequeño que el tamaño de la textura, pero es más pronunciado cuando la imagen se dibuja en una cantidad muy pequeña de píxeles.
Con mipmaps, el hardware tendrá acceso a la versión 2x2 de la textura, por lo que cada píxel en ella será el color promedio de ese cuadrante de la imagen. Esto elimina el parpadeo de color impar.
http://en.wikipedia.org/wiki/Mipmap
Editar para las personas que dicen que esto ya no es cierto: Es cierto que muchos GPU modernas pueden apoyar no-poder-de-dos texturas, pero también es cierto que muchos no pueden.
De hecho, la semana pasada tenía una textura de 1024x768 en una aplicación XNA en la que estaba trabajando, y causó una falla al cargar el juego en una computadora portátil que tenía solo un año de antigüedad. Sin embargo, funcionó bien en la mayoría de las máquinas. Es una apuesta segura que el gpu del iPhone es considerablemente más simple que un gpu de PC completo.
Normalmente, el hardware de gráficos funciona de forma nativa con texturas en dimensiones de potencia de 2. No estoy seguro de los detalles de implementación/construcción que hacen que este sea el caso, pero generalmente es así en todas partes.
EDIT: Con un poco de investigación, resulta que mi conocimiento está un poco desactualizado: muchas tarjetas gráficas modernas ahora pueden manejar tamaños de texturas arbitrarios. Me imagino que con las limitaciones de espacio del procesador de gráficos de un teléfono, probablemente necesitarían omitir cualquier cosa que requiera silicio adicional como ese.
Imagino que es una optimización bastante decente en el hardware de gráficos asumir texturas de potencia de 2. Compré una nueva computadora portátil, con el último hardware de gráficos portátiles, y si las texturas no son potencia-2 en maya, la representación está completamente desordenada.
Intente implementar el mapeo de texturas envolventes en el software y descubrirá rápidamente por qué es deseable el tamaño de poder-de-2.
En resumen, encontrará que si puede asumir las dimensiones de potencia de 2, muchas multiplicaciones enteras y divisiones se convierten en cambios de bit.
Me atrevo a adivinar que la tendencia reciente en relajar esta restricción se debe a que las GPU pasan a las matemáticas de punto flotante.
Editar: La respuesta "debido a mipmapping" es incorrecta. Las texturas Mipmapped, non-power-of-two son una característica común de las GPU modernas.
Es cierto que muchas GPU modernas pueden admitir texturas que no sean de potencia de dos, pero también es cierto que muchas no pueden. De hecho, la semana pasada teníamos una textura de 1024x768 en una aplicación XNA en la que estábamos trabajando, y causó una falla al cargar el juego en una computadora portátil que tenía solo un año de antigüedad. –
Entonces, ¿qué relevancia tiene mipmapping? – Menkboy
La relevancia para la pregunta de los que preguntan es que su hardware no es compatible con mipmapping, por lo que simplemente "no lo hace". El efecto resultante es el parpadeo. La otra opción (tratar de procesar un tamaño de imagen no compatible) sería un bloqueo. –
¿Está utilizando compresión PVRTC? Eso requiere poderes de 2 e imágenes cuadradas.
- Puede encontrar información de soporte OpenGL ES acerca de los dispositivos de Apple iPod/iPhone aquí: Apple OpenES support
- OpenGL ES 2.0 se define como igual a OpenGL 2.0
- La restricción sobre la textura del tamaño de ha sido desaparecerá únicamente de la versión 2.0 Entonces, si usa OpenGL ES con una versión inferior a la 2.0, es una situación normal.
- 1. WebGL y texturas rectangulares (potencia de dos)
- 2. Sin potencia de dos texturas en iOS
- 3. ¿Cuán más eficaces son las texturas de potencia de dos?
- 4. ¿Se deben voltear las texturas OpenGL?
- 5. WebGL y la potencia del tamaño de dos imágenes
- 6. ¿Cómo multiplico los espectros de dos imágenes de diferentes dimensiones?
- 7. ¿Puede OpenGL ES renderizar texturas de dimensiones no base 2?
- 8. ¿Por qué un tamaño de búfer de anillo debe tener una potencia de 2?
- 9. UITableViewCell con imágenes en diferentes dimensiones
- 10. ¿Por qué las variables de bucle se deben firmar en paralelo para?
- 11. ¿Deben reemplazarse las variables estáticas por enumeraciones?
- 12. ¿Por qué las uniones anónimas globales deben declararse como estáticas?
- 13. Combinar dos imágenes en una nueva imagen
- 14. matriz de dos dimensiones para una sola dimensión y viceversa
- 15. ¿Por qué se emite este código complejo para dividir un entero con signo por una potencia de dos?
- 16. ¿Por qué no puedo omitir las dimensiones por completo al inicializar una matriz multidimensional?
- 17. Rellenar una estructura C++ con una potencia de dos
- 18. ¿Las GUI deben tener sus propias pruebas automatizadas?
- 19. ¿Por qué los usuarios de cocos2d-iphone deben evitar usar la extensión de archivo @ 2x?
- 20. elemento de adición en dos dimensiones ArrayList
- 21. Buscando una "aguja" en un "pajar" de dos dimensiones
- 22. ¿Deben las aplicaciones web mvc tener 3 niveles?
- 23. ¿Hay una forma de programación para obtener dimensiones estándar en el SDK de iPhone
- 24. ¿Por qué las funciones de subprocesos deben declararse como '__cdecl'?
- 25. Google Analytics, ¿por qué tener dos bloques de script?
- 26. cuarzo: Obtención de las imágenes del diff de dos imágenes
- 27. ¿Por qué las variables pasadas a ejecutable deben ser definitivas?
- 28. ¿Por qué las sobrecargas del operador C# deben ser estáticas?
- 29. Imágenes para retina pantalla iphone
- 30. ¿Cómo acceder a las imágenes desde las imágenes guardadas de manera programática en el iphone SIN UImagePickerController?
¡Gran explicación! –