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的可用插槽.除非您明确设置寄存器,否则无法保证编译器会影响着色器之间相同常量缓冲区的相同插槽.