сжатие текстур dxt4 - PullRequest
       10

сжатие текстур dxt4

1 голос
/ 02 апреля 2012

Если учитывать производительность, мы (неохотно) используем сжатие текстур.Артефакты, возникающие при сжатии, могут быть более или менее приемлемыми.Каковы различные возможности, обходные пути, которые могут быть применены на исходном уровне изображения, чтобы минимизировать артефакты, представленные алгоритмом сжатия.В моей текущей ситуации большинство артефактов видны при использовании градиентов.

1 Ответ

4 голосов
/ 02 апреля 2012

Сжатие DXT это все о интерполяции или градиентах, если хотите. Однако вы должны хорошо понимать, что именно это делает. Сжатие DXT - это компромисс, оно предлагает довольно плохое качество при довольно плохом сжатии, но оно обеспечивает некоторое сжатие и почти тривиально для аппаратной реализации и работает практически без затрат. Вот почему он используется.

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

Прежде всего, обратите внимание, что:

  • DXT кодирует цвета блоков 4x4 текселей, сохраняя два цвета 5: 6: 5 и интерполируя по этой линии в пространстве RGB. Интерполяция квантуется на 2 бита, поэтому у вас есть только 4 значения на пиксель.
  • Альфа-канал в DXT4 / 5 хранит два 8-битных альфа-значения и использует 3-битные интерполяторы.
    • DXT2 / 3 использует явные 4 бита на альфа-канал текселей (то есть не интерполируя между некоторыми выбранными 8-битными значениями).
    • DXT1 может выдавать 1-битный альфа-канал, но это уловка сортировки / кодирования и другая история.
  • Невозможно получить чистый серый цвет в DXT без преобразования в другое цветовое пространство (из-за хранения конечных точек 5: 6: 5).

Это означает, что DXT может в принципе (более или менее) идеально воспроизводить множество горизонтальных, вертикальных или диагональных 1D-градиентов, которые не имеют слишком резких изменений, но совершенно не способны воспроизвести большинство других шаблонов (хотя обычно они могут воспроизводить что-то близкое).
Например, если у вас есть 2D-градиент или повернутый градиент, нет никакого способа (за исключением простого совпадения!), Что существует пара из двух цветов, которые позволят красиво интерполировать весь блок 4x4. Кроме того, поскольку интерполяция квантуется только на 4 варианта, подавляющее большинство «нечетных вращений» просто не может быть закодировано, равно как и многие комбинации цветов. Однако для большинства «натуральных» текстур это приемлемо.

Компрессор DXT обычно делает попытку найти наилучшую возможную посадку в ячейке 4x4 (хотя некоторые компрессоры будут / могут делать что-то другое). Это может привести к переходу в градиенты, даже если градиент внутри ячейки представлен хорошо.

Что вы можете сделать с DXT:

  • Используйте разные компрессоры и выбирайте лучший результат. Существует как минимум 3 разные стратегии (без грубой силы), которые используются разными компрессорами и дают совершенно разные результаты.
  • Попробуйте библиотеку crunch . Для этого где-то есть компрессор с графическим интерфейсом Windows. В то время как crunch в первую очередь нацелен на получение файлов размером меньших (после сжатия zip) и, наконец, ограничен техническими ограничениями формата блока DXT, он использует необычную технику поиска, которая учитывает гораздо большие диапазоны. может случиться так, что ему удастся придать одному или другому из ваших градиентов лучший вид.
  • Избегайте 2D-градиентов, которые не выровнены по u / v или диагонали, потому что вы знаете, что их невозможно кодировать.
  • Преобразование естественных изображений в цветовое пространство не RGB перед сжатием. YCoCg и YCbCr могут быть кандидатами или преобразованием JPEG-LS. Человеческий глаз не одинаково чувствителен во всех отношениях. Некоторые ошибки менее очевидны. Использование другого цветового пространства использует это.
  • Используйте альфа-канал для самого важного канала, если вам не нужна альфа-канал, поскольку вы знаете, что он имеет разрешение 8-битной конечной точки (вместо 5/6) и 3-битные интерполяторы вместо 2-битных. В противном случае используйте зеленый для наиболее важного канала, так как он имеет еще один бит.
  • Для текстур, нарисованных от руки, вы можете попытаться использовать 5: 6: 5 подходящих цветов, которые по крайней мере дадут идеальные удары для них.Хотя для «нарисованных» текстур (что-то похожее на комикс) DXT в целом является очень неразумным выбором.
  • Для случаев, когда качество просто не снижает его, не используйте DXT (да,это звучит как глупый совет, но на самом деле ... если он не подходит, не используйте его).
...