Конечно, ограничение мощности 2 было встроено в OpenGL еще в (очень) первые дни компьютерной графики (до доступного аппаратного ускорения), и это было сделано по соображениям производительности. Низкоуровневый код рендеринга получает приличное повышение производительности, когда его можно жестко запрограммировать для текстур степени двух. Даже в современных графических процессорах POT-текстуры работают быстрее, чем NPOT-текстуры, но разница в скорости намного меньше, чем раньше (хотя это может быть заметно на многих устройствах ES).
GuyNoir, что вам нужно сделать, это построить атлас текстуры. Я только что решил эту проблему в прошлые выходные для своей собственной игры для Android. Я создал класс с именем TextureAtlas, и его конструктор вызывает glTexImage2D (), чтобы создать большую текстуру любого размера, который я выберу (пропуская ноль для значений пикселей). Затем я могу вызвать add (id, bitmap), который вызывает glTexSubImage2D (), несколько раз, чтобы упаковать в меньшие изображения. Класс TextureAtlas отслеживает используемое и свободное пространство внутри более крупной текстуры и прямоугольников, в которых хранится каждое растровое изображение. Затем код рендеринга может вызвать get (id), чтобы получить прямоугольник для изображения в атласе (который затем может быть преобразован в текстуру). координаты).
Примечание № 1: Выбор наилучшего способа упаковки с различными размерами текстур НЕ является тривиальной задачей. Я решил начать с простой логики в классе TextureAtlas (например, пишущая машинка + возврат каретки + перевод строки) и убедиться, что загружаю изображения в лучшем порядке, чтобы воспользоваться этой логикой. В моем случае это должно было начаться с наименьших квадратов и перейти к изображениям со средним квадратом. Затем я загружаю любые короткие + широкие изображения, запускаю CR + LF, а затем загружаю любые высокие + худые изображения. Я загружаю самые последние квадратные изображения последним.
Примечание 2: Если вам нужно несколько текстурных атласов, попробуйте сгруппировать в них изображения, которые будут отображаться вместе, чтобы минимизировать количество переключений текстур (что может снизить производительность). Например, в моей игре для Android я поместил все статические элементы игрового поля в один атлас, а все кадры с различными анимационными эффектами - во второй атлас. Таким образом, я могу связать атлас № 1 и нарисовать все на игровом поле, затем я могу связать атлас № 2 и нарисовать все специальные эффекты поверх него. Два выбора текстуры на кадр очень эффективны.
Примечание № 3: Если вам нужно повторять / зеркально отражать текстуры, они должны переходить в свои собственные текстуры, и вам нужно масштабировать их (не добавляйте черные пиксели, чтобы заполнить края).