Как бороться с искажением текстуры, вызванным «возведением в квадрат» текстур, и взаимодействием с mipmapping? - PullRequest
2 голосов
/ 27 марта 2012

Предположим, у меня есть текстура, которая естественно не квадратная (например, фотографическая текстура чего-то с соотношением сторон 4: 1).И предположим, что я хочу использовать сжатие PVRTC для отображения этой текстуры на устройстве iOS, которое требует, чтобы текстура была квадратной.Если я масштабирую текстуру так, чтобы она была квадратной при сжатии, в результате получается очень размытое изображение при просмотре текстуры с расстояния.

Я считаю, что это вызвано мипмапингом.Поскольку фильтр mipmap видит новое большее растянутое измерение, он использует его для выбора низкого уровня mip, что на самом деле не правильно, так как эти пиксели были просто растянуты до этого размера.Если бы он посмотрел на другое измерение, он бы выбрал более высокий уровень разрешения.

Эта теория (в некоторой степени) подтверждается наблюдением, что если я оставлю текстуру в формате, который не должен быть квадратнымверсии mipmap выглядят просто модно.

Существует параметр смещения LOD, но в документах говорится, что он применяется к обоим измерениям.Кажется, что то, что требуется, - это способ смещения LOD, но только в одном измерении (то есть, чтобы сместить его в сторону большего разрешения в измерении текстуры, которая была увеличена).

Кроме прерываниягеометрия, позволяющая использовать квадратные подмножества исходной текстуры (что недопустимо, приведите наш производственный конвейер), есть ли у кого-нибудь умные хаки, которые они использовали для решения этой проблемы?

1 Ответ

0 голосов
/ 27 марта 2012

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

[Хмм. Просто понял, что в следующем я предполагаю, что координаты Vбегите сверху донизу ... вам нужно разрешить мне быть старой школой :-)]

Первое, что приходит на ум, это взять свой 4N * N (X * Y)исходную текстуру и повторите ее 4x по вертикали, чтобы получить текстуру 4N * 4N, а затем отрегулируйте координаты V на модели, чтобы они составляли 1/4 от их текущих значений.Это не сильно сэкономит вам с точки зрения памяти (поскольку это фактически означает, что PVRTC с 4 битами на канал становится в 4 раза больше), но все же сохранит пропускную способность и пространство кеша, поскольку остальные частитекстура не будет доступна.MIP mapping также будет работать вплоть до текстур 1x1.

В качестве альтернативы, если вы хотите сэкономить немного места и у вас есть пара 4N * N текстур, вы можете попробовать объединить их в "вроде "4N * 4N атлас.Поместите первую текстуру в верхние N рядов, затем следуйте за ней по N / 2 из верхних рядов.Упакуйте нижние N / 2 строки 2-й текстуры, затем вторую текстуру, а затем верхние N / 2 строки.Наконец, сделайте нижние N / 2 строки первой текстуры.Для UV, которые получают доступ к первой текстуре, делим то же самое на 4 для параметра V.Для второй текстуры вам нужно разделить на 4 и добавить 0,5. Это должно работать нормально, пока уровень карты MIP не станет настолько маленьким, что две текстуры будут смешаны вместе ... но я сомневаюсь, что это действительно будет проблемой.

...