gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 17:01:42 25 4
gpt4 key购买 nike

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

float4 myVar;

在着色器文件的顶层声明,并且
cbuffer myBuffer
{
float4 myVar;
}

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

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

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

任何人都可以阐明这两种语法之间的区别,如果它们实际上不同,插槽号如何分配给 .fx 文件中的声明以及插槽号如何在着色器之间共享?

任何帮助表示赞赏

最佳答案

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

如 MSDN 文档的链接中所述,“默认常量缓冲区”部分,说明未在常量缓冲区内定义的变量将最终出现在名为“$Global”的默认全局常量缓冲区中。

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

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

关于directx - 如何使用着色器常量缓冲区?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15898578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com