Повысить производительность за счет повторного использования альфа-канала текстуры RGB?

У меня 48-битная текстура RGB16F.

https://www.khronos.org/registry/OpenGL-Refpages/es3.0/html/glTexImage2D.xhtml утверждает, что при использовании RGB. 1.0 будет помещен в альфа-канал.

1.0 неявно или хранится на самом деле?

И в последнем случае. Мой главный вопрос: если я помещу свою 16-битную карту высот в альфа-канал, она станет RGBA16F. Могу ли я улучшить производительность?

Любые идеи приветствуются.


person Martin Dalgaard    schedule 13.03.2017    source источник


Ответы (2)


1.0 неявно или хранится на самом деле?

Это зависит от реализации. Если бы вы спрашивали о текстурах 888 и 8888, я бы сказал вам, что почти каждая реализация обязана использовать 32 бита на тексель, но я не уверен в форматах 16F. Это говорит о том, что Metal не определяет формат RGB16F (ссылка ), что убедительно свидетельствует о том, что графические процессоры PowerVR по крайней мере дополнят формат. Vulkan действительно определяет RGB16F, но хотя спецификация требует поддержки R16F, RG16F и RGBA16F, она не требует поддержки RGB16F (ссылка), что снова указывает на отсутствие встроенной поддержки некоторыми поставщиками. Я не удивлюсь, если какой-нибудь графический процессор где-нибудь действительно поддерживает RGB16F, но я подозреваю, что большинство из них просто подкладывают. Для более точного ответа вам может потребоваться задать вопросы на форумах по графическим процессорам или поэкспериментировать, изучив использование памяти в некоторых контролируемых условиях.

И в последнем случае. Мой главный вопрос: если я помещу свою 16-битную карту высот в альфа-канал, она станет RGBA16F. Могу ли я улучшить производительность?

Вы производите сэмплирование в одно и то же время (т.е. из одного шейдера с одинаковыми UV-развертками)? Если так, то да, безусловно, это будет лучший выбор, чем использование RGB16F плюс R16F. Если они не выбраны вместе (например, карта высот выбирается в вершинном шейдере, цвет - в шейдере фрагмента), то догадаться труднее. Вероятно, вы снизите производительность при выборке карты высот (эти лишние байты взорвали кеш), но не повредите выборку цвета (все равно там было заполнение) - в целом вы потеряете некоторую производительность, но сэкономите немного памяти - любая потеря производительности вероятно, довольно незначительный, и если ваше узкое место кроется в другом месте, оно может вообще не навредить.

person Columbo    schedule 13.03.2017
comment
Если у вас есть другое временное использование (например, вершинный шейдер с использованием поля высоты, фрагментный шейдер с использованием цвета), не упаковывайте их. Потеря производительности может быть незначительной, но вы будете использовать гораздо больше пропускной способности из памяти (эффективно загружая всю текстуру дважды в архитектуре на основе плиток), что является отличным способом сократить время автономной работы. - person solidpixel; 14.03.2017

1.0 неявно или хранится на самом деле?

Я подозреваю "оба", хотя, возможно, не так, как вы имеете в виду.

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

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

person solidpixel    schedule 14.03.2017