Frostbite PBR: различное сжатие на отдельных каналах текстуры одинаковой текстуры

Возможно ли, и если да, как это возможно, создать и прочитать RGBA-текстуру с разными алгоритмами сжатия на отдельных каналах в OpenGL4.x:

Пример А без реального значения:

  1. RG channel хранит карту нормалей, закодированную в 3Dc
  2. КаналB хранит значения высоты, скажем, тесселяции с некоторой кодировкой
  3. Канал хранит rawID без сжатия

Пример Б:

  1. RGB хранит параметры материала, сжатые с помощью DXT1
  2. Сохраняет MaterialID без сжатия

Фон:

В реализации Frostbite " Физическое рендеринг PBR (PDF)" на стр. 15 и 18 авторы описывают, как они структурировали параметры материала в различные текстурные каналы. Они также упоминают, что избегали сжатия текстур на некоторых каналах, не вдаваясь в детали, какие каналы они имеют в виду.

Страница 15

Все базовые атрибуты (Normal, BaseColor, Smoothness, MetalMask, Reflectance) должны быть смешанными для поддержки отложенных надписей. Невозможные атрибуты, такие как MaterialId, сохраняются в альфа-канале. Мы такжеизбегали механизмов сжатия и кодирования, которые могли бы повлиять на качество смешивания.

Страница 18

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

1 ответ

Решение

Нет OpenGL или аппаратной поддержки для чтения текстуры с разной компрессией на разных каналах. Конечно, можно создать предварительный проход, который разделит такую ​​текстуру ручной работы на отдельные текстуры, а затем распакует их отдельно.

Как предположил Ник Болас, реализация Frostbite PBR позволяет избежать сжатия из-за смешивания.

Другие вопросы по тегам