如何使用着色器常量缓冲区?

Ano*_*Dev 5 directx shader hlsl

我正在努力理解DirectX中的常量缓冲区.我见过两种语法

float4 myVar;
Run Code Online (Sandbox Code Playgroud)

在着色器文件的顶级声明

cbuffer myBuffer
{
    float4 myVar;
}
Run Code Online (Sandbox Code Playgroud)

详见http://msdn.microsoft.com/en-gb/library/windows/desktop/bb509581(v=vs.85).aspx

我知道需要将常量缓冲区分配给插槽(从零开始索引),并且可以在代码中设置.

我看了(SlimDX VS SharpDX)的两个框架似乎有不同的习惯来设置他们 - 按插槽编号由字符串名称(通过着色器反射?)和SharpDX SlimDX - 虽然它并不清楚其中从获得的插槽号?

任何人都可以了解两种语法之间的差异,如果它们实际上是不同的,如何将槽号分配给.fx文件中的声明以及如何在着色器之间共享槽号?

任何帮助赞赏

xoo*_*ofx 11

当使用原始Direct3D10/Direct3D11 API(通过Direct3D10.Device.XXX.SetConstantBuffers和Direct3D11.DeviceContext.XXX.SetConstantBuffers)时,SharpDX和SlimDX都使用相同的约定.

正如MSDN文档中的链接"默认常量缓冲区"中所述,解释了未在常量缓冲区内定义的变量将在名为"$ Global"的默认全局常量缓冲区中结束.

另一方面,传统效果框架(与RAW Direct3D10 + API交互)通过其名称提供对单个变量的访问.在内部,他们使用ShaderReflection查询Constant Buffers的内容,并自动处理这些常量缓冲区的分配/更新/上传.最后,这是将上传到GPU的常量缓冲区,而不是单个变量(不存在于常量缓冲区之外).传统效果框架通过使用ShaderReflection查询绑定槽来动态处理绑定常量缓冲区的槽.

插槽编号由编译器在编译时分配.如果未明确指定寄存器(请参阅MSDN文档中的cbuffer寄存器),编译器将影响第一个使用的cbuffer的可用插槽.除非您明确设置寄存器,否则无法保证编译器会影响着色器之间相同常量缓冲区的相同插槽.

  • Effects11/Effects/FX文件已经过时,不再由Microsoft维护(这就是为什么整个Effects11甚至只能从旧的DirectX 2010年6月SDK或博客文章中访问).因此,他们不再改进它以支持下一个Direct3D功能.从Windows RT应用程序中也无法使用它. (2认同)