Задний план
В нашем приложении мы используем таблицу спрайтов PNG, где каждый спрайт используется только как маска. Они успешно загружены с использованием GLKTextureLoader
. Когда iOS 7 достигла 5-й / 6-й бета-версии, что-то изменилось в GLKTextureLoader
работе, так как внезапно все наши PNG начали неправильно отображаться, как будто что-то не так с предварительным умножением альфа.
После отправки отчетов об ошибках и отсутствия ответа от Apple (а проблема, к сожалению, все еще присутствует в действующей версии iOS 7), мы решили преобразовать наши PNG в формат PVR.
Проблема
При попытке загрузить текстуру PVR с помощью GLKTextureLoader
:
NSDictionary *options = @{ GLKTextureLoaderOriginBottomLeft : @YES, GLKTextureLoaderApplyPremultiplication : @NO };
GLKTextureInfo *textureInfo = [GLKTextureLoader textureWithContentsOfURL:url options:options error:&error];
происходит сбой с ошибкой 12 (GLKTextureLoaderErrorDataPreprocessingFailure
). Что входит в этот этап «предварительной обработки» и в чем может быть проблема?
Вот некоторые вещи, которые я проверил:
- URL действительный
- Расширение файла -
.pvr
. - Изображение имеет квадратные размеры POT (512x512).
- Я пробовал несколько форматов PVR, включая сжатые и несжатые (PVRTC 4bpp, RGBA8888, L8, A8)
- Я поставил glErrorChecks до и после
textureWithContentsOfURL:options:error:
, но ничего не регистрируется (предположительно,GLKTextureLoader
использует ошибку GL или ошибка не связана с OpenGL)
Этот ответ указывает на то, что это может быть вызвано повреждением файла. Это заставляет меня задаться вопросом, правильно ли я генерирую PVR. Я использую PVRTexToolGUI от Imagination для преобразования PNG:
- Откройте PNG в PVRTexToolGUI
- Предварительно умножьте альфа (хотя я также пробовал это без этого шага)
- Закодируйте текущую текстуру в новый формат (пробовали несколько форматов, как описано выше)
- Сохраните текстуру как файл .pvr.