Текстура OpenGL ES 2.0 не отображается на некоторых устройствах

Я нашел фреймворк трехмерной графики для Android под названием Rajawali, и я учусь его использовать. Я следовал основному уроку - рендерингу объекта shpere с изображением jpg размером 1024x512 для текстуры. Он отлично работал на Galaxy Nexus, но не работал на Galaxy Player GB70.

Когда я говорю, что это не работает, я имею в виду, что объект появляется, но текстура не отображается. В конце концов, я изменил некоторые параметры, которые я использую для фреймворка Rajawali при создании текстур, и заставил его работать. Вот что я узнал.

Причина исходила от того, где GL_TEXTURE_MIN_FILTER был установлен. Среди следующих четырех значений

GLES20.GL_LINEAR_MIPMAP_LINEAR
GLES20.GL_NEAREST_MIPMAP_NEAREST
GLES20.GL_LINEAR
GLES20.GL_NEAREST

текстура отображается только тогда, когда GL_TEXTURE_MIN_FILTER не установлен фильтр с использованием mipmap. Так когда GL_TEXTURE_MIN_FILTER установлен на последние два, это работает.

Теперь вот то, что я не понимаю и мне интересно. Когда я уменьшаю изображение, которое я использую в качестве текстуры, до размера 512x512, GL_TEXTURE_MIN_FILTER Настройки не имеют значения. Все четыре настройки фильтра min работают.

Поэтому мой вопрос: есть ли требования к размерам изображения при использовании минимального фильтра для текстуры? Например, я должен использовать квадратное изображение? Могут ли быть проблемы другие вещи, такие как стиль обертки или конфигурация магнитного фильтра?

Или это похоже на ошибку реализации OpenGL устройства?

1 ответ

Доброе утро, это типичный пример не-силы 2 текстур.

Текстуры должны иметь степень двойки в своем разрешении по множеству причин, это очень распространенная ошибка, и случалось так, что все попадали в эту ловушку:) и я тоже.

Тот факт, что на некоторых устройствах / графических процессорах бесперебойно работают две текстуры, зависит только от реализации драйверов OpenGL, некоторые графические процессоры их четко поддерживают, другие нет, я настоятельно рекомендую вам использовать текстуры pow2, чтобы иметь возможность чтобы гарантировать работу на всех устройствах.

И последнее, но не менее важное: использование не мощных двух текстур может привести к катастрофическим последствиям в использовании памяти графического процессора, поскольку большинству драйверов, которые принимают текстуры не power of 2, необходимо масштабировать в памяти текстуры до ближайшего более высокого значения коэффициента 2, Например, наличие текстуры 520X520 может привести к фактическому отображению памяти 1024X1024.

Это то, что вы не хотите, потому что в реальном мире "размер имеет значение", особенно на мобильных устройствах.

Вы можете найти довольно хорошее объяснение в OpenGL Gold Book, OpenGL ES 2.0:

В OpenGL ES 2.0 текстуры могут иметь размеры не степени двух (npot). Другими словами, ширина и высота не должны быть степенью двойки. Тем не менее, OpenGL ES 2.0 имеет ограничение на режимы обтекания, которые можно использовать, если размеры текстуры не являются степенью двойки. То есть для текстур npot режим обтекания может быть только GL_CLAMP_TO_EDGE, а фильтр минимизации может быть только GL_NEAREST или GL_LINEAR (иными словами, не может быть отображен с помощью mip- map). Расширение GL_OES_texture_npot ослабляет эти ограничения и позволяет использовать режимы обтекания GL_REPEAT и GL_MIRRORED_REPEAT, а также позволяет отображать текстуры npot с помощью полного набора фильтров минимизации.

Я предлагаю вам оценить эту книгу, так как она достаточно неплохо освещает эту тему.

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