Конвертируйте текстуру NPOT PVR в POT в iOS

Я хотел бы вручную загрузить текстуры NPOT PVR на iOS (я не имею в виду загрузку текстуры в память OpenGL, я имею в виду загрузку ее в пользовательскую структуру данных, которая позволяет получить доступ к данным изображения, чтобы увеличить холст и снова сохранить его как новый PVR).

Я спрашиваю об этом, потому что мы реализуем приложение OpenGL для iOS с большим количеством фоновых текстур (480 x 320 на дисплеях без сетчатки). Мы намерены хранить эти текстуры в виде файлов NPOT PVR, поэтому мы имеем прирост памяти на iPhone 3GS+.

3G-iPhone не может загружать текстуры NPOT PVR в не OpenGL памяти. Я намерен реализовать шаг предварительной обработки для 3G-устройств, который преобразует все текстуры NPOT PVR в POT PVR и сохраняет их в папке Cache приложения.

Можно ли таким образом загружать и обрабатывать PVR? Например, TexturePacker генерирует PVR.

2 ответа

Решение

Конечно да.

  1. Распакуйте формат файла.
  2. Масштабировать необработанные данные изображения
  3. Сжатие новых масштабированных данных и сохранение

Для первого шага см. https://github.com/Volcore/quickpvr или PowerVR SDK.

Для третьего шага нет общедоступной документации или реализации сжатия PVRTC. Итак, у вас есть несколько вариантов. Используйте комбинацию class-dump и otx для декомпиляции texturetool от Apple (не рекомендуется) или (и, возможно, проще) для написания собственного кодировщика на основе любой спецификации формата файла, которую вы можете создать из шага 1.

Однако, учитывая вашу ситуацию, я бы просто сделал это как предварительно обработанный шаг и включил две версии ваших текстур вместе с вашим приложением.

Если вам не нужна текстура для автоматического повторения / переноса, и вы просто собираетесь использовать тексели размером 480 x 320 в качестве подмножества, скажем, текстуры 512x512 и никогда не получать доступ к частям, где X > 480 и y > 320, тогда вы можете переставить данные.

Одним из предложений будет добавление исходных изображений размером до 512x512 (используя некоторый постоянный цвет), сжатие их, а затем просто сохранение соответствующих частей текстуры. Когда вы загрузите текстуру в приложении, просто добавьте недостающие сжатые данные. (Просто понял, что это не самое ясное из описаний:-|).

Обратите внимание, что вам нужно принять во внимание порядок хранения (который, вероятно, описан в ссылке, которую дал bronxbomber92), но мне просто пришло в голову, что может быть более простой подход. Сжатые данные располагаются / чередуются в 64-битных порциях. Если вы дополнили исходное изображение постоянным цветом, после сжатия (по крайней мере, с помощью компрессора IMG PVRTextool) должен быть разумный процент (~38%) 64-битных блоков, которые совпадают. Вы можете использовать, скажем, набор флагов, чтобы отметить, какие 64-битные слова используют эту "одинаковую" константу, чтобы избежать сохранения этих данных.

Другие вопросы по тегам