Могу ли я изменить точки привязки в скомпилированном шейдере D3D?

У меня есть HLSL-шейдер, который определяет некоторые ресурсы, скажем, постоянный буфер:

cbuffer MyCB : register(b0);

Если я скомпилирую свой шейдер, я смогу запросить регистр через API отражения. Но возможно ли менять регистр (например, для b3) аналогичным образом в скомпилированном блобе шейдера можно назначить точки привязки для ресурсов в скомпилированной программе OpenGL?

3

Решение

Не существует API для изменения привязок шейдера во время выполнения в скомпилированном шейдере.

Если вы прыгнули через много обручей, вы могли бы достичь этого с динамическое связывание шейдеров в Shader Model 5.0, хотя это было бы много работы и не стоило того, когда есть очень простая альтернатива — просто создайте новый скомпилированный шейдер с желаемыми привязками.

3

Другие решения

Вы можете сделать это в указав BaseShaderRegister кроме нуля, или используя разные RegisterSpace значения, в D3D12_DESCRIPTOR_RANGE структура. Если изменения кода невозможны, вы можете неявно изолировать каждый набор регистров, установив корневой параметр ShaderVisibility имущество. Это изолирует, например, VS b0 от PS b0, Для более подробной информации, вы можете проверить видео для разработчиков по теме.

Единственный случай, когда у вас возникнут проблемы, — это если вы на самом деле явно привязали два ресурса к одному и тому же слоту и зарегистрировали пространство (явно указав его с помощью синтаксиса шейдерной модели 5.1). В этом случае вы должны понимать, что в D3D12 регистры являются общими для нескольких этапов, и вы должны убедиться, что у вас нет коллизий.

В D3D11 эта проблема не возникает, поскольку каждый этап имеет свое собственное регистровое пространство (VS b0 это не то же самое, что PS b0) и ты не может поделиться, даже если вы хотели. Тем не менее, если у вас по какой-то причине есть компонент, жестко запрограммированный для прикрепления данных к VS b0 но ваш вершинный шейдер уже скомпилирован, чтобы ожидать его в b1, ты мало что можешь сделать.

1

По вопросам рекламы [email protected]