Плитка сжатия текстур PVR (экспонирование контекста края)

StackOverflow https://stackoverflow.com/questions/1233652

Вопрос

У меня есть сжатие текстур PVR, которое работает хорошо в моей игре для iPhone, но у меня есть проблемы при объединении нескольких текстур. По сути, у меня очень большой фон, который разбит на несколько плиток 512x512, все сжатые PVR. Затем они объединяются, чтобы выглядеть как одно большое фоновое изображение. Как работает PVR, потому что он не знает, что он должен сжимать текстуру, как если бы она была действительно большой текстурой - то есть использовать мозаичную информацию соседа, чтобы определить, как выполнить сжатие PVR.

Я могу придумать пару способов сделать это.

1) Каким-то образом сообщите программе командной строки texturetool для размещения других изображений, которые будут смежными.
2) Используйте программу командной строки, чтобы сгенерировать огромную текстуру PVR, которая представляет все изображение, а затем как-то разделить байты на несколько изображений - возможно, это невозможно.
3) Сделайте некоторую хитрость OpenGL ES, которая хорошо сочетает края.
4) Сделайте некоторую хитрость, когда у меня есть избыточная информация в каждой плитке, а затем обрежьте эти области при рисовании текстуры (пожалуйста, нет).

Надеюсь, я могу сделать 1, 2 или 3, или есть другое известное решение.

Это было полезно?

Решение

В итоге я выбрал вариант 4. Я не думаю, что это была ситуация, когда PVRTC не подходит - фактически это почти необходимость. Когда у меня в общей сложности 24 512x512 текстур в памяти одновременно (представляющих очень большой фон и передний план), помещать их в несжатый формат - самоубийство. Поэтому я просто использовал PVR-сжатие как обычно, а затем отредактировал несколько строк кода в своем алгоритме разбиения на листы так, чтобы они перекрывались и урезались по 15 пикселей на каждом конце. Вуаля, выглядит отлично. Это заняло пару дней и было довольно раздражающим, но я думаю, что это хороший вариант для людей, которым нужен очень большой плиточный фон на iPhone.

Другие советы

Мой лучший совет, но не то, что вы спрашивали, это знать, когда PVRTC не подходит. Безусловно, самое простое решение - просто не использовать PVRTC для этих плиток. Я потратил много времени, пытаясь изогнуть PVRTC для работы в ситуациях, для которых он просто не подходит.

Тем не менее,

При использовании PVRTC текстура всегда предполагается мозаичной (с самой собой), поэтому пиксели на правом краю влияют на пиксели на левом краю (то же самое с верхним и нижним краем). Поэтому варианты 1 или 2, скорее всего, не сработают.

Одна из возможностей - добавить альфа-канал к плиткам и позволить им постепенно исчезать по краям, чтобы при их наложении они переходили друг в друга. Имейте в виду, что PVRTC лучше работает с постепенными альфа-затуханиями. Жесткие альфа-края часто имеют артефакты в PVRTC.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top