常量缓冲区变量如何在 C++ 代码和着色器代码之间匹配?

How is constant buffer variables got matched between C++ code and shader code?

我正在自学D3D11。我想知道 C++ 中的变量如何与着色器中的变量匹配?

例如来自D3D11的教程:https://docs.microsoft.com/en-us/windows/win32/direct3d11/overviews-direct3d-11-resources-buffers-constant-how-to

C++中CBuffer的布局与shader中的布局完全一样。但是,在Unity等一些游戏引擎中,shader变量可以按任意顺序放置,只要我将它们全部声明即可。这是如何实现的?

渲染引擎自动绑定shader变量到图形管线布局的实现我没有深究。但这是我的猜测。

  • 游戏引擎在编译着色器代码时,会写入一些着色器头信息,包括着色器变量的布局。

这可以通过glslang等工具来实现。这种工具可以将着色器源代码转换为抽象语法树(AST),这意味着着色器代码被解析为多种类型的ast节点,例如输入属性和输出变量。此时,它可以为输入的着色器变量分配一个显式布局,并将布局保存在着色器头文件中。

  • 在初始化图形管线时,可以根据shader header创建管线布局。

以上只是我对可能实现的猜测。

Unity 等许多引擎都具有着色器的动态绑定系统。这也是 shader reflection and other metadata. This was implemented in the old DirectX Effects system 的某种组合。

最终,CPU端内存缓冲区和着色器端常量缓冲区的布局仍然是匹配的,只是在运行时通过代码完成,而不是由开发人员完成。