Frostbite PBR: различное сжатие на отдельных каналах текстуры одинаковой текстуры
Возможно ли, и если да, как это возможно, создать и прочитать RGBA-текстуру с разными алгоритмами сжатия на отдельных каналах в OpenGL4.x:
Пример А без реального значения:
- RG channel хранит карту нормалей, закодированную в 3Dc
- КаналB хранит значения высоты, скажем, тесселяции с некоторой кодировкой
- Канал хранит rawID без сжатия
Пример Б:
- RGB хранит параметры материала, сжатые с помощью DXT1
- Сохраняет MaterialID без сжатия
Фон:
В реализации Frostbite " Физическое рендеринг PBR (PDF)" на стр. 15 и 18 авторы описывают, как они структурировали параметры материала в различные текстурные каналы. Они также упоминают, что избегали сжатия текстур на некоторых каналах, не вдаваясь в детали, какие каналы они имеют в виду.
Страница 15
Все базовые атрибуты (Normal, BaseColor, Smoothness, MetalMask, Reflectance) должны быть смешанными для поддержки отложенных надписей. Невозможные атрибуты, такие как MaterialId, сохраняются в альфа-канале. Мы такжеизбегали механизмов сжатия и кодирования, которые могли бы повлиять на качество смешивания.
Страница 18
Мы решили избежать сжатия некоторых из наших атрибутов и в этом случае полагаемся на простое линейно-интерполяционное альфа-смешение.
1 ответ
Нет OpenGL или аппаратной поддержки для чтения текстуры с разной компрессией на разных каналах. Конечно, можно создать предварительный проход, который разделит такую текстуру ручной работы на отдельные текстуры, а затем распакует их отдельно.
Как предположил Ник Болас, реализация Frostbite PBR позволяет избежать сжатия из-за смешивания.