Suresh, la limitación de la potencia de 2 fue incorporada en OpenGL en los (muy) primeros días de los gráficos por computadora (antes de la aceleración de hardware asequible), y se realizó por motivos de rendimiento. El código de renderizado de bajo nivel obtiene un aumento de rendimiento decente cuando se puede codificar de forma rígida para texturas de potencia de dos. Incluso en las GPU modernas, las texturas POT son más rápidas que las texturas NPOT, pero la diferencia de velocidad es mucho menor de lo que solía ser (aunque aún puede notarse en muchos dispositivos ES).
GuyNoir, lo que debe hacer es crear un atlas de textura. Acabo de resolver este problema este fin de semana pasado para mi propio juego de Android. Creé una clase llamada TextureAtlas, y su constructor llama a glTexImage2D() para crear una textura grande de cualquier tamaño que elija (pasando null para los valores de píxel). Luego puedo llamar a add (id, bitmap), que llama glTexSubImage2D(), repetidamente para empacar las imágenes más pequeñas. La clase TextureAtlas rastrea el espacio libre y usado dentro de la textura más grande y los rectángulos en los que se almacena cada mapa de bits. Entonces el código de representación puede llamar a get (id) para obtener el rectángulo de una imagen dentro del atlas (que luego puede convertir a textura coordenadas).
Nota al margen # 1: Elegir la mejor manera de empacar en varios tamaños de textura NO es una tarea trivial. Elegí comenzar con una lógica simple en la clase TextureAtlas (piense en máquina de escribir + retorno de carro + avance de línea) y me aseguro de cargar las imágenes en el mejor orden para aprovechar esa lógica. En mi caso, eso fue para comenzar con las imágenes cuadradas más pequeñas y avanzar hasta las imágenes cuadradas medianas. Luego cargo cualquier imagen corta + ancha, fuerzo un CR + LF, y luego cargo cualquier imagen alta + delgada. Cargué las imágenes cuadradas más grandes al último.
Nota lateral n. ° 2: si necesita varios atlas de textura, intente agrupar las imágenes dentro de cada una que se renderizarán juntas para minimizar el número de veces que necesita cambiar texturas (lo que puede matar el rendimiento). Por ejemplo, en mi juego para Android pongo todos los elementos de la placa de juego estática en un atlas y todos los cuadros de varios efectos de animación en un segundo atlas. De esa forma puedo unir el atlas # 1 y dibujar todo en el tablero, luego puedo unir el atlas # 2 y dibujar todos los efectos especiales encima. Dos selecciones de textura por cuadro es muy eficiente.
Nota lateral n. ° 3: si necesita texturas repetitivas/duplicadas, necesitan ir en sus propias texturas, y necesita escalarlas (no agregar píxeles negros para rellenar los bordes).
potencia de dos! = Cuadrado. 32x64 es potencia de dos, no cuadrada, 13x13 es cuadrada, no potencia de dos. – Bahbar
Buen punto. Sin embargo, en cualquier caso, tiene que ser el poder de dos. – GuyNoir