Предикация
Предикация — это функция, которая позволяет GPU, а не ЦП определять, что не следует рисовать, не копировать и не отправлять объект.
Общие сведения
Типичное использование предикаций — с окклюзией; Если ограничивающий прямоугольник нарисован и заключается, то, очевидно, нет смысла в рисовании самого объекта. В этом случае рисование объекта может быть "предикатным", что позволяет удалить его из фактической отрисовки GPU.
Во-первых, это может показаться избыточным более чем стандартный тест глубины плюс ранний проход глубины. Но предикация может устранить накладные расходы на само состояние команды рисования, а также растеризацию. Хотя ранний проход глубины удаляет ненужные пиксели, он по-прежнему может выполнять вершинные, корпусные, доменные и геометрические шейдеры, а также вызывать ассемблер входных данных с фиксированной функцией, тесселатор и растеризатор. Рисуя простой ограничивающий прямоугольник или аналогичный ограничивающий том, который проще обрабатывать и растеризовать, чем реальная модель, можно избежать ненужной растеризации и обработки.
В отличие от Direct3D 11, предикация отделяется от запросов и расширяется в Direct3D 12, чтобы позволить приложению предикатировать объекты на основе любых причин, которые разработчик приложения может решить (а не только загораживания).
SetPredication
Предикацию можно задать на основе значения 64-разрядных значений в буфере (см . D3D12_PREDICATION_OP).
Когда GPU выполняет команду SetPredication , он привязывает значение в буфере. Будущие изменения данных в буфере не влияют задним числом на состояние предикаций.
Если входной параметр Buffer имеет значение NULL, предикация отключена.
Указания предикаций отсутствуют в API Direct3D 12; Предикация и разрешена для списков команд прямого, вычислительного и копирования. Исходный буфер может находиться в любом типе кучи (по умолчанию, отправке, обратной передаче, настраиваемой).
Базовая среда выполнения проверит следующее:
- Значение AlignedBufferOffset кратно 8 байтам
- Ресурс является буфером
- Операция является допустимым членом перечисления
- Не удается вызвать SetPredication из пакета
- Тип списка команд поддерживает предикацию
- Смещение не превышает размер буфера
Уровень отладки выдает ошибку, если исходный буфер не находится в состоянии D3D12_RESOURCE_STATE_PREDICATION (то же, что и D3D12_RESOURCE_STATE_INDIRECT_ARGUMENT и просто псевдоним).
Набор операций, которые могут быть предупретированы:
- DrawInstanced
- DrawIndexedInstanced
- Dispatch
- CopyTextureRegion
- CopyBufferRegion
- CopyResource
- CopyTiles
- ResolveSubresource
- ClearDepthStencilView
- ClearRenderTargetView
- ClearUnorderedAccessViewUint
- ClearUnorderedAccessViewFloat
- ExecuteIndirect
ExecuteBundle не является предикатом. Вместо этого отдельные операции из приведенного выше списка, которые содержатся в части пакета, являются предикатами.
Методы ID3D12GraphicsCommandList ResolveQueryData, BeginQuery и EndQuery не являются предикатами.
Связанные темы
Обратная связь
https://aka.ms/ContentUserFeedback.
Ожидается в ближайшее время: в течение 2024 года мы постепенно откажемся от GitHub Issues как механизма обратной связи для контента и заменим его новой системой обратной связи. Дополнительные сведения см. в разделеОтправить и просмотреть отзыв по