Gpu — Вычислительные Шейдеры: Одноразовые И Постоянные Буферы

  • Автор темы Stekolshiki
  • Обновлено
  • 19, Oct 2024
  • #1

При использовании вычислительного шейдера можно ли сохранять буфер в памяти графического процессора в течение всего времени выполнения приложения, чтобы всякий раз, когда исходный вычислительный шейдер или другие вычислительные шейдеры выполняются позже, они могли получить доступ к данным из такого буфера и/или или обновить их?

Если да, то каков правильный способ объявления/ссылки на буферы, если вы хотите, чтобы они были постоянными в графическом процессоре, а не только одноразовыми? Если это поможет, я использую CG в Unity, но ответ, не зависящий от движка/языка, подойдет.

#gpu #compute-shader #память #буферы

Stekolshiki


Рег
06 Mar, 2017

Тем
69

Постов
215

Баллов
600
  • 26, Oct 2024
  • #2

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

Я не могу говорить о способе распределения постоянных буферов в Unity — я работаю с Unity и много пишу шейдеры на Cg, но большая часть нашего материала находится на мобильных устройствах, поэтому вычислительные шейдеры не подходят. Однако в недавнем проекте, который я использовал с использованием OpenGL, буфер обычно будет зависать до тех пор, пока вы не скажете ему этого не делать, и даже в этом случае нет никакой гарантии, что память будет своевременно освобождена.

Выделение буфера в современном OpenGL выполняется путем вызова glCreateBuffers и передачи ему указателя на массив GLuint, который будет хранить «имена» ваших буферов, а затем вызова glBufferData или glBufferStorage для фактического выделения и заполнения VRAM для этого буфера. Вызов glBufferData второй раз для того же имени буфера выделит новое хранилище для этого буфера, а исходное хранилище станет «осиротевшим». Это похоже на перераспределение объекта в Java: имя переменной больше не будет указывать на этот объект, но другие части системы все еще могут иметь ссылки на него (например, если он все еще где-то используется для чтения текстуры), поэтому он будет не подлежит очистке, пока все ссылки на него не исчезнут.

Вызов glDeleteBuffers с именем буфера имеет аналогичный эффект, но без выделения нового хранилища. В обоих случаях хранилище будет нет удаляться до тех пор, пока в системе не исчезнут абсолютно все ссылки на него. Даже в этом случае это больше похоже на сбор мусора в Java, чем на удаление в C++, система вполне может удерживать память в течение довольно долгого времени, чтобы повторно использовать ее для любых будущих выделений, которые вы можете сделать.

Результатом всего этого является то, что зачастую лучше выделить буферы один раз, когда вы запускаете приложение, и по мере необходимости пропускать через них различные данные. В OpenGL буфер будет сохраняться на протяжении всего времени существования приложения, если вы явно не удалите или не перераспределите его. Я уверен, вы знаете, что система рендеринга Unity имеет свои особенности, но в принципе она должна вести себя аналогично.

 

Arbincnam13


Рег
25 Oct, 2024

Тем
64

Постов
174

Баллов
514
Похожие темы Дата
Похожие темы
Здание Принтера — Проблема Со Сборкой Anet A6 — Оставшиеся Кабели Питания Не Соответствуют Инструкциям
Есть Ли Какой-Либо Открытый Исходный Код Для Упрощения Тетраэдральной Сетки?
Как Динамически Рассчитывать Координаты Текстуры В Вершинном Шейдере С Помощью Opengl?
Css – Почему Мой Img Оставляет Незаполненное Пространство Размером 1 Пиксель В Ячейке Таблицы?
Вставка Имен В Определенное Место Поверх Изображения, Пакетная Обработка
Adobe Illustrator — Странные Линии В Svg В Браузере, Которые Не Видны В Ai
Рекомендация Программного Обеспечения — Самый Простой Способ Создать Изображение Коробки Продукта
Gimp – Как Применить Сглаживание К Слою С Прозрачным Фоном?
Adobe Indesign — Одновременное Изменение Размера Нескольких Элементов До Определенного Значения В Их Собственной Позиции.
Может Ли Логотип, В Котором Используются Лицензионные Шрифты, Стать Товарным Знаком?
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно