【问题标题】:How is constant buffer variables got matched between C++ code and shader code?C++ 代码和着色器代码之间如何匹配常量缓冲区变量?
【发布时间】:2021-09-07 03:23:00
【问题描述】:

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

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

C++中CBuffer的布局与shader中的布局完全相同。但是,在 Unity 等一些游戏引擎中,着色器变量可以按任意顺序放置,只要我声明所有这些变量即可。这是如何实现的?

【问题讨论】:

  • 链接不起作用
  • @rustyBucketBay 已修复

标签: unity3d directx-11


【解决方案1】:

像 Unity 这样的许多引擎都有着色器的动态绑定系统。这是shader reflection 和其他元数据的某种组合。这也是在旧的 DirectX Effects system 中实现的。

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

【讨论】:

    【解决方案2】:

    我还没有深入研究渲染引擎如何自动将着色器变量绑定到图形管道布局的实现。但这是我的猜测。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-09
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2011-10-19
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      相关资源
      最近更新 更多