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

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

6 ответов


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

что такое mipmapping?

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

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

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

для некоторых аппаратных средств также требуется квадратное изображение, но это уже не очень распространено.

зачем вам mipmapping?

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

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

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

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

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

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

на самом деле, только на прошлой неделе у меня была текстура 1024x768 в приложении XNA, над которым я работал, и это вызвало сбой при загрузке игры на ноутбуке, которому было всего около года. Хотя на большинстве машин он работал отлично. Могу поспорить, что графический процессор iPhone значительно проще, чем полный графический процессор ПК.


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

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


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

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


вы используете сжатие PVRTC? Это требует полномочий 2 и квадратных изображений.


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

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

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

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