Сжатие текстур без потерь для OpenGL - PullRequest
0 голосов
/ 09 сентября 2018

У меня есть несколько 32-битных (с альфа-каналом) растровых изображений, которые я использую в качестве важной информации в своей игре. Малейшее изменение значений RGBA нарушает все, поэтому я не могу использовать методы сжатия с потерями, такие как S3TC.

Существуют ли возможные алгоритмы сжатия без потерь, которые я могу использовать с OpenGL? Я использую фрагментные шейдеры, и я хочу использовать метод glCompressedTexImage2D () для определения текстуры. Я не пробовал сжимать текстуру с помощью OpenGL с использованием параметра GL_COMPRESSED_RGBA , есть ли шанс получить сжатие без потерь таким образом?

1 Ответ

0 голосов
/ 09 сентября 2018

Сжатие текстур, в отличие от обычного сжатия изображений, предназначено для одной конкретной цели: текстура .А это означает быстрый произвольный доступ к данным.

Форматы сжатия без потерь обычно не очень эффективны, когда речь идет о шаблонах произвольного доступа.Основные форматы сжатия без потерь - это некоторая форма RLE или табличного кодирования.Их достаточно для распаковки всего набора данных одновременно, но они ужасны , когда могут узнать, в какой ячейке памяти находится значение texel (U, V).

И этовопрос задается много при доступе к текстурам.

Таким образом, аппаратные форматы сжатия текстур без потерь отсутствуют.

Возможны следующие варианты:

  1. Использование текстурной памяти как своего рода кеша.То есть, когда вы определите, что вам понадобится определенное изображение в этом кадре, распакуйте его.Это может быть сделано на процессоре или графическом процессоре (через вычислительные шейдеры или тому подобное).Обратите внимание, что для быстрой декомпрессии с помощью графического процессора вам придется придумать схему сжатия, которая использует преимущества параллельного выполнения.Большинство форматов сжатия без потерь не особенно параллельны.

    Если определенное изображение не использовалось какое-то время, вы помещаете его в стопку «для повторного использования».А если вам нужно распаковать новое изображение, вы можете извлечь из этой стопки наименее последнее использованное изображение, вместо того, чтобы постоянно создавать / уничтожать объекты текстуры OpenGL.

  2. Создание собственногоСхема сжатия без потерь, разработанная для ваших конкретных потребностей.Если вам абсолютно необходимы точные значения текселей из текстуры, я предполагаю, что вы не используете линейную фильтрацию при доступе к этим текстурам.Так что это не совсем цвета;это произвольная информация о текселе.

    Я мог бы предложить сжатие полей (улучшенная упаковка ваших битов в доступное пространство).Но, не зная, что на самом деле означают ваши данные, я не могу сказать, подойдет ли вам ваш конкретный вариант использования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...