如何解决将无绑定描述符用于缓冲区资源是否有意义?
我正在我的 directx12 项目中尝试使用 bindless hlsl 资源绑定,我可以理解为什么 bindless 对绑定纹理很有用,因为您可以执行以下操作:
DescriptorTable(
SRV(t0,space=0,numDescriptors=unbounded,offset=0),SRV(t0,space=1,offset=),space=2,offset=0)
visibility=SHADER_VISIBLITY_ALL)
Texture2D textures2d[8192] : register(t0,space0);
Texture3D textures3d[8192] : register(t0,space1);
TextureCube texturesCube[8192] : register(t0,space2);
但是如何绑定缓冲区资源,例如 StructuredBuffer
s?由于它们需要有一个关联的类型,例如 StructuredBuffer<some_struct>
,您将如何在 HLSL 中声明它们?例如,假设您有许多不同类型的 StructuredBuffer
,您是否必须将它们分别绑定到一个单独的空间?
struct point_light
{
float3 position_ws;
float falloff_start;
float3 color;
float falloff_end;
float3 strenght;
uint id;
};
RWStructuredBuffer<point_light> sb_point_lights : register(u0,space0);
struct spot_light
{
float3 position_ws;
float falloff_start;
float3 color;
float falloff_end;
float3 strenght;
float spot_power;
float3 direction;
uint id;
};
StructuredBuffer<spot_light> sb_spot_lights : register(u0,space1);
或者有没有办法做类似的事情(不起作用):
struct point_light
{
float3 position_ws;
float falloff_start;
float3 color;
float falloff_end;
float3 strenght;
uint id;
};
RWStructuredBuffer<point_light> sb_point_lights : register(u0,space0);
struct spot_light
{
float3 position_ws;
float falloff_start;
float3 color;
float falloff_end;
float3 strenght;
float spot_power;
float3 direction;
uint id;
};
StructuredBuffer<spot_light> sb_spot_lights : register(u0 + offset_to_spotlights,space0);
解决方法
如果你需要在相同类型的缓冲区之间切换,动态索引确实很有用,但是正如你提到的你需要声明相同类型的资源(也就是说,纹理也是一样的,我有常见的用例例如,Texture2d
所以是的,你必须为每个类型的缓冲区声明一个不同的数组,这不是很方便。
如果你想对你的资源拥有完全的动态访问权限(不管是什么类型),Shader Model 6.6 引入了对堆的直接访问(代号: Ultimate bindless ;)
所以你有一个名为ResourceDescriptorHeap的全局变量(代表当前绑定的资源堆)
和 SamplerDescriptorHeap(相同,但用于采样器)。
现在你可以做(例如):
int textureLocationInHeap =5;
int bufferLocationInHeap = 6;
Texture2D myTexture = ResourceDescriptorHeap[textureLocationInHeap];
StructuredBuffer<float> myBuffer = ResourceDescriptorHeap[bufferLocationInHeap ];
然后,您可以使用根常量或常量缓冲区(根据您的喜好)传递 textureLocationInHeap 和 bufferLocationInHeap。
您不再需要传递描述符表(您当然仍然可以混合使用表/“直接访问”
当然请注意,如果您索引的资源类型不正确(或者您有一个空的堆槽),您将面临未定义的结果或驱动程序崩溃(第二个更有可能)。
>关于动态资源绑定的更多信息:
https://devblogs.microsoft.com/directx/in-the-works-hlsl-shader-model-6-6/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。