Почему изображения для текстур на iPhone должны иметь два измерения?

Я пытаюсь решить эту мерцающую проблему на iphone (open gl es game). У меня есть несколько изображений, которые не имеют размерности-2. Я собираюсь заменить их изображениями с соответствующими размерами... но почему размеры должны быть равны двум?

Ответ 1

Причина, по которой большинство систем (даже многие современные графические карты) требуют текстуры из двух текстур, - это mipmapping.

Что такое mipmapping?

Меньшие версии изображения будут созданы для того, чтобы все выглядело правильно при очень небольшом размере. Изображение делится на 2 снова и снова, чтобы создавать новые изображения.

Итак, представьте себе изображение 256x128. Это будет иметь меньшие версии, созданные с размерами 128x64, 64x32, 32x16, 16x8, 8x4, 4x2, 2x1 и 1x1.

Если это изображение было 256x192, оно будет работать нормально, пока вы не достигнете размера 4x3. Следующее меньшее изображение будет 2x1.5, что, очевидно, не является допустимым размером. Некоторые графические устройства могут справиться с этим, но многие типы не могут.

Некоторое аппаратное обеспечение также требует квадратного изображения, но это уже не так часто.

Зачем вам нужно mipmapping?

Представьте, что у вас есть изображение, которое ОЧЕНЬ далеко, так далеко, чтобы быть только размером 4 пикселя. Теперь, когда каждый пиксель рисуется, позиция на изображении будет выбрана в качестве цвета для этого пикселя. Таким образом, вы получаете 4 пикселя, которые, возможно, вообще не представляют изображение в целом.

Теперь представьте, что картина движется. Каждый раз, когда создается новый кадр, выбирается новый пиксель. Поскольку изображение SO далеко, вы, скорее всего, увидите очень разные цвета для небольших изменений в движении. Это приводит к очень уродливому миганию.

Недостаток mipmapping вызывает проблемы для любого размера, который меньше размера текстуры, но он наиболее выражен, когда изображение тянется до очень небольшого количества пикселей.

С mipmaps аппаратное обеспечение будет иметь доступ к текстуре 2x2, поэтому каждый пиксель на ней будет средним цветом этого квадранта изображения. Это устраняет проблескивание нечетного цвета.

http://en.wikipedia.org/wiki/Mipmap

Изменить людям, которые говорят, что это не так: Это правда, что многие современные графические процессоры могут поддерживать текстуры без питания двух, но это также верно, что многие не могут.

Фактически, только на прошлой неделе у меня была текстура 1024x768 в приложении XNA, над которым я работал, и это вызвало крах при загрузке игры на ноутбуке, которому было всего около года. Однако он работал отлично на большинстве машин. Это безопасная ставка, что iPhone gpu значительно проще, чем полный ПК gpu.

Ответ 2

Как правило, графическое оборудование работает с текстурами в параметрах power-of-2. Я не уверен в деталях реализации/конструкции, которые приводят к тому, что это так, но обычно это как везде.

EDIT: с небольшим исследованием выясняется, что мои знания немного устарели - многие современные графические карты теперь могут обрабатывать произвольные размеры текстур. Я бы предположил, что с ограниченным пространством графического процессора телефона, вероятно, им нужно было бы опустить все, что требовало бы дополнительного силикона.

Ответ 3

  • Вы можете найти информацию о поддержке OpenGL ES об устройствах Apple Ipod/Iphone здесь: Поддержка Apple OpenES
  • OpenGL ES 2.0 определяется как равный OpenGL 2.0
  • Ограничение размера текстуры исчезло только с версии 2.0 Поэтому, если вы используете OpenGL ES с версией менее 2.0, это нормальная ситуация.

Ответ 4

Я представляю себе довольно приличную оптимизацию в графическом оборудовании, чтобы принять текстуры power-of-2. Я купил новый ноутбук с новейшим графическим оборудованием для ноутбуков, и если текстуры не являются силовыми 2 в Maya, рендеринг будет испорчен.

Ответ 5

Используете ли вы PVRTC-сжатие? Для этого требуются полномочия 2 и квадратных изображений.

Ответ 6

Попробуйте внедрить текстурирование текстур в программном обеспечении, и вы быстро обнаружите, почему желательны размеры мощности.

Короче говоря, вы обнаружите, что, если вы можете принять измерения мощности из-2, то множество целых умножений и делений превращаются в бит-сдвиги.

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

Изменить: Ответ "из-за mipmapping" неверен. Mipmapped, non-power-of-two текстуры являются общей чертой современных графических процессоров.