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

Directx 如何使用着色器常量缓冲区?,directx,shader,hlsl,Directx,Shader,Hlsl,我正在努力理解DirectX中的常量缓冲区。我见过两种语法 float4 myVar; 在着色器文件的顶层声明,并 cbuffer myBuffer { float4 myVar; } 详细说明 我知道常量缓冲区需要分配给插槽(基于零的索引),并且可以在代码中设置 我所看到的两个框架(SlimDX和SharpDX)似乎使用了不同的约定来设置它们——SlimDX通过字符串名称(通过着色器反射?)和SharpDX通过插槽编号——尽管不清楚插槽编号从何处获得 有人能解释这两种语法之间的区别

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

float4 myVar;
在着色器文件的顶层声明,并

cbuffer myBuffer
{
    float4 myVar;
}
详细说明

我知道常量缓冲区需要分配给插槽(基于零的索引),并且可以在代码中设置

我所看到的两个框架(SlimDX和SharpDX)似乎使用了不同的约定来设置它们——SlimDX通过字符串名称(通过着色器反射?)和SharpDX通过插槽编号——尽管不清楚插槽编号从何处获得

有人能解释这两种语法之间的区别吗?如果它们实际上不同,那么.fx文件中的声明是如何分配槽号的,以及着色器之间是如何共享槽号的


感谢您提供的任何帮助

您所参考的文档都是针对纯D3D着色器模型api的。您需要咨询每个单独的中间件(SlimDX或SharpDX),以了解它们的语法和底层映射之间的对应关系

我可以断言,任何第三方发行版都可以完全自由地定义自己的语法(可以以任何过于复杂的方式实现),但这是您必须接受的。您需要查阅每个第三方供应商的相应文档以了解映射,因为详细信息可能因版本而异。如果源代码可用,您可以自己检查它以了解映射。考虑到某些框架的“黑箱”性质,您可能只需要接受框架的文档化——在这种情况下,引用规范/基本库文档将是一个错误或抽象泄漏


最后一个问题是:为什么您关心实现/映射?这些库的全部目的是以一种方便的方式抽象出细节。就个人而言,我可以理解为什么这可能令人沮丧(特别是如果出于任何原因,您求助于规范文档而不是平台文档),但是您所支付的相关成本是选择这样一个平台而不是直接使用核心库的结果/权衡。

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

如MSDN文档“默认常量缓冲区”一节中的链接所述,解释了未在常量缓冲区中定义的变量将最终位于名为“$Global”的默认全局常量缓冲区中

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

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

第一种语法:

float4 myVar;
是微软的effect语法,其中第二个是直接的hlsl。Effect语法通过自动为您分配常量缓冲区简化了一些事情,但这是以牺牲灵活性为代价的

使用SharpDX,您可以向插槽1分配一个常量缓冲区,如下所示:

cbuffer myBuffer: register(b1)
{
    float4 myVar;
}

谢谢,我不认为他们从硬件模型中抽象出常数缓冲区有插槽。这两个语法以及插槽如何编号的问题与包装器无关,我认为?是的,你的问题实际上提出了核心库和包装器库的问题。在选择包装器库时会出现一大堆常见的问题,这些问题不一定与问题域相关或是唯一的。如果这有帮助的话,这就是我正在努力的方向。真正的问题是您所引用的框架没有足够的文档吗?我不这么认为-它们都是DirectX的精简包装器-缓冲槽的概念是DirectX的概念,而不是包装器库的概念。这是一个文档(或者我没有找到文档)问题,尽管我相信。谢谢-如果可以的话,请跟进一次-你在这里说效果框架是遗留的-这是否意味着效果11也应该避免?我看不到上面提到的内容,尽管提到它主要是为了移植Effects 10的易用性。建议完全跳过它的使用吗?Effects11/Effects/FX文件已经过时,不再由Microsoft维护(这就是为什么整个Effects11甚至只能从旧的DirectX 2010年6月SDK或博客文章中访问)。因此,他们不会再改进它以支持下一个Direct3D功能。从Windows RT应用程序中使用它也是不可能的。