#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, таких как входной атрибут и выходная переменная. В это время он может назначить явный макет входным переменным шейдера и сохранить макет в заголовке шейдера.
- При инициализации графического конвейера макет конвейера может быть создан в соответствии с заголовком шейдера.
Вышесказанное-это всего лишь мое предположение о возможной реализации.