2016-07-22 8 views
1

Я немного смущен о существовании метода ID3D12GraphicsCommandList::SetGraphicsRootSignature. Из того, что я понимаю из this MSDN page, кажется, что единственное его правильное использование - всегда вызывать его после SetPipelineState, предоставляя ему ту же корневую подпись, что и при создании объекта состояния конвейера. Если это так, какая польза от него не подразумевается? Существуют ли другие способы использования этого метода?В чем смысл настройки SetGraphicsRootSignature D3D12?

ответ

3

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

Вы, скорее всего, позвоните по телефону SetGraphicsRootSignature, а затем SetGraphicPipelineState. Вот почему.

+0

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

1

«Коренная подпись» в DirectX 12 предоставляет общую информацию о расположении для обмена данными между структурами данных ЦП и выполнением языка шейдера графического процессора. DirectX 12 заставляет программиста решить, сколько корневых подписей они хотят использовать, когда их использовать и какие объекты состояния контуров нуждаются в корневой подписи. В Direct3D 11 есть по существу одна «корневая подпись», активная во все времена, которая довольно велика.

Коренные подписи могут быть изменены довольно часто без серьезного наказания, но предполагается, что у вас будет несколько корневых подписей и много PSO, а не переписка 1: 1.

Для простоты в DirectX Tool Kit for DirectX 12, мы устанавливаем корневой подпись каждый раз, когда мы устанавливаем ПСО в методе IEffect::Apply, даже если мы используем только несколько различных подписей корневые.