Я собираюсь добавить поддержку вычислительных шейдеров в мою кодовую базу и у меня возникнут проблемы с поиском ответов на некоторые довольно простые вопросы:
Во всей документации говорится, что конвейер Compute Shader работает независимо от графического процессора, однако весь пример кода dx11 использует контекстный интерфейс устройства для настройки самого шейдера, просмотра ресурсов и вызова метода dispatch (), поэтому они ставятся в очередь в команде буфер с остальными командами рендеринга или они выполняются независимо?
В ответ на вопрос 1, могу ли я вызвать вычислительные шейдеры из нескольких потоков или мне нужно буферизовать все команды вычислительных шейдеров и выдать их в том потоке, в котором был создан непосредственный контекст устройства?
Синхронизация. В большинстве статей используется команда CopyResource, которая автоматически синхронизирует завершение вычисляемого шейдера и дает процессору доступ к результатам, но, похоже, это также заблокирует графический процессор. Есть ли более эффективный способ синхронизации?
Я знаю, что смогу найти ответы на эти вопросы, экспериментируя, но любая помощь, которая экономит мое время, будет принята с благодарностью.
Конвейер Compute Shader работает независимо от Rendering конвейер, то есть вершинные шейдеры, пиксельные шейдеры, смешанные состояния и т. д. не влияют на то, что происходит при вызове Dispatch()
, Тем не менее, они попадают в одну и ту же очередь, поэтому порядок между вызовами Draw
а также Dispatch
сохранены
Все вызовы непосредственного контекста должны выполняться из одного потока.
Один общий подход заключается в использовании двух буферов. В то время как один работает с вычислительным шейдером, другой копируется обратно и читается процессором. Большинство графических процессоров смогут распараллелить это.
Других решений пока нет …