Как сопоставляются переменные постоянного буфера между кодом C и кодом шейдера?

#unity3d #directx-11

Вопрос:

Я сам изучаю D3D11. Мне интересно, как переменная в c сопоставляется с переменными в шейдере?

Например, из учебника по D3D11: https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-buffers-constant-how-to

Компоновка CBuffer в C точно такая же, как и в шейдере. Однако в некоторых игровых движках, таких как Unity, переменные шейдера могут располагаться в любом порядке, если я объявлю их все. Как это достигается?

Комментарии:

1. ссылка не работает

2. @rustyBucketBay исправлено

Ответ №1:

Многие движки, такие как Unity, имеют системы динамической привязки для шейдеров. Это некоторая комбинация отражения шейдера и других метаданных. Это также было реализовано в старой системе эффектов DirectX.

В конце концов, все еще есть совпадение компоновки буфера памяти на стороне процессора и буфера констант на стороне шейдера, это просто делается с помощью кода во время выполнения, а не разработчиком.

Ответ №2:

Я не углублялся в реализацию того, как механизм рендеринга автоматически привязывает переменную шейдера к компоновке графического конвейера. Но вот мое предположение.

  • В то время как игровой движок компилирует коды шейдеров, он напишет некоторые сведения о заголовках шейдеров, включая макеты шейдеров, изменяемые.

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

  • При инициализации графического конвейера макет конвейера может быть создан в соответствии с заголовком шейдера.

Вышесказанное-это всего лишь мое предположение о возможной реализации.