GLKTextureLoader не может загрузить PVR (ошибка 12 - сбой предварительной обработки)

Задний план

В нашем приложении мы используем таблицу спрайтов 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:

  1. Откройте PNG в PVRTexToolGUI
  2. Предварительно умножьте альфа (хотя я также пробовал это без этого шага)
  3. Закодируйте текущую текстуру в новый формат (пробовали несколько форматов, как описано выше)
  4. Сохраните текстуру как файл .pvr.

person Stuart    schedule 21.09.2013    source источник


Ответы (1)


Существует 2 версии PVR файла: новая и старая. Попробуйте сохранить текстуры PVR в другом формате файла (сохранить как устаревший).

person keaukraine    schedule 22.09.2013
comment
Отлично, спасибо. Это было хорошо спрятано! В меню файла PVRTexToolGUI есть пункт «Сохранить как устаревший ...», а GLKTextureLoader работает с устаревшим форматом. Есть ли какая-либо документация от Apple, в которой упоминается, какая версия файла PVR поддерживается? - person Stuart; 22.09.2013
comment
Собственно, я работаю с PVRTC только на платформе Android и использую устаревший формат файлов. Я думаю, что устаревший формат является общим для обеих платформ. Рад, что это решило вашу проблему :) - person keaukraine; 22.09.2013