#iphone #opengl-es #pvrtc
#iPhone #opengl-es #pvrtc
Вопрос:
У меня есть одна большая png-текстура 4096×4096, части которой мне нужно загрузить в память. Я уже разделил большую текстуру png на 16 плиток 1024×1024, а затем преобразовал их в файлы, сжатые в формате PVR.
Проблема в том, что когда я рисую эти плитки, края между плитками не совпадают с краями в формате png. Итак, я думаю, что если есть инструмент для создания одной 4096×4096 PVR-текстуры, то ее можно разделить на 16 PVR-плиток 1024×1024??
Ответ №1:
С помощью PVR (который является более общим форматом файла текстуры, поддерживающим несколько типов текстур) Я полагаю, вы имеете в виду PVRTC?
PVRTC не основан на блоках в традиционном смысле, когда, скажем, с помощью ETC или S3TC текстура разбивается на блоки размером 4×4 пикселя, и каждый блок сжимается отдельно. Вместо этого он пытается разделить данные между наборами перекрывающихся окрестностей пикселей. Он также (своего рода) предполагает, что текстура, вероятно, состоит из плиток, так что, например, крайняя левая крайняя область фактически разделяет информацию с крайней правой стороной (и аналогично для верха и низа). Обычно это не слишком большая проблема, если только края не совершенно разные.
Если вы таким образом попытаетесь разделить уже сжатую текстуру на более мелкие области, это не сработает, потому что компрессор сделал предположения о том, что было общим в большом изображении, которое не будет таким же, как маленькое.
Что касается сжатия каждого фрагмента по отдельности, похоже, что края каждого отдельного фрагмента могут сильно отличаться. Единственное, что я могу придумать, это нарезать вашу исходную текстуру, скажем, на (2 ^ N -4) x (2 ^ N -4) единицы, но сохранить их по центру в 2 ^ N * 2 ^ N текстурах, где вы дополняете границу в 2 пикселя копией исходных пикселей. Затем вы настраиваете отображение текстур так, чтобы использовать только центральную (2 ^ N -4) область x (2 ^ N -4). Мы надеемся, что это уменьшит артефакты разрыва.
Комментарии:
1. Нет ли способа исправить это перетекание через край каким-либо другим способом, кроме добавления границ? Моя проблема в том, что мне нужна текстура power-of-2, и я не могу добавить границы и масштаб текстуры, потому что это означало бы потерю некоторого качества.
2. Что ж, PVRTC2 решил бы проблему, но, несмотря на то, что он присутствует в оборудовании PowerVR, ну, возможно, десятилетие, он не доступен в некоторых популярных устройствах. Я также понимаю, что у вас есть дискретизация пикселей в текселях в соотношении 1: 1 и что вы не используете билинейную дискретизацию, достаточно тщательно выровняли свои координаты текселей или использовали зажим. Я немного подумаю над этим, но также было бы полезно, если бы вы спросили на форуме PowerVR Insider.
3. Спасибо! Да, я использую режим clamp, поэтому я ожидал бы увидеть отсутствие переноса. Я также разместил вопрос на форумах PowerVR: community.imgtec.com/forums/topic /…