У меня есть HLSL-шейдер, который определяет некоторые ресурсы, скажем, постоянный буфер:
cbuffer MyCB : register(b0);
Если я скомпилирую свой шейдер, я смогу запросить регистр через API отражения. Но возможно ли менять регистр (например, для b3
) аналогичным образом в скомпилированном блобе шейдера можно назначить точки привязки для ресурсов в скомпилированной программе OpenGL?
Не существует API для изменения привязок шейдера во время выполнения в скомпилированном шейдере.
Если вы прыгнули через много обручей, вы могли бы достичь этого с динамическое связывание шейдеров в Shader Model 5.0, хотя это было бы много работы и не стоило того, когда есть очень простая альтернатива — просто создайте новый скомпилированный шейдер с желаемыми привязками.
Вы можете сделать это в direct3d12 указав BaseShaderRegister
кроме нуля, или используя разные RegisterSpace
значения, в D3D12_DESCRIPTOR_RANGE
структура. Если изменения кода невозможны, вы можете неявно изолировать каждый набор регистров, установив корневой параметр ShaderVisibility
имущество. Это изолирует, например, VS
b0
от PS
b0
, Для более подробной информации, вы можете проверить видео для разработчиков по теме.
Единственный случай, когда у вас возникнут проблемы, — это если вы на самом деле явно привязали два ресурса к одному и тому же слоту и зарегистрировали пространство (явно указав его с помощью синтаксиса шейдерной модели 5.1). В этом случае вы должны понимать, что в D3D12 регистры являются общими для нескольких этапов, и вы должны убедиться, что у вас нет коллизий.
В D3D11 эта проблема не возникает, поскольку каждый этап имеет свое собственное регистровое пространство (VS
b0
это не то же самое, что PS
b0
) и ты не может поделиться, даже если вы хотели. Тем не менее, если у вас по какой-то причине есть компонент, жестко запрограммированный для прикрепления данных к VS
b0
но ваш вершинный шейдер уже скомпилирован, чтобы ожидать его в b1
, ты мало что можешь сделать.