0

我有一个小项目,我正在试验 D3D12 光线追踪(或者我想要)。我设置了一个带有 BLAS 和 TLAS 的场景。我想将此 TLAS 与内联光线跟踪一起使用。我的 TLAS 现在处于 UAV 状态(使用 D3D12_RESOURCE_BARRIER_TYPE_UAV)。在我的 HLSL 中,我声明我的根签名如下:

#define _RootSignature "RootFlags( ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT | DENY_HULL_SHADER_ROOT_ACCESS | DENY_DOMAIN_SHADER_ROOT_ACCESS | DENY_GEOMETRY_SHADER_ROOT_ACCESS )," \
                       "CBV( b0 ), CBV( b1 ), CBV( b2 )," \
                       "SRV( t0 )"

RaytracingAccelerationStructure rayTracingScene : register( t0 );

我现在的困境是,如何将我的 TLAS 绑定到rayTracingScene. 如果我尝试 SetGraphicsRootShaderResourceView,则会出现错误:

D3D12 错误:ID3D12CommandList::SetGraphicsRootShaderResourceView:资源(0x000001BDEB5FAA60:'TLAS')的资源状态(0x400000:D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE)(子资源:0)对于用作根着色器资源无效。Expected State Bits (all): 0xC0: D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, Actual State: 0x400000: D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE, Missing State: 0xC0: D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE. 此验证在命令列表记录期间在绑定时强制执行,因为根签名中此资源的描述符声明为 DATA_STATIC_WHILE_SET_AT_EXECUTE。[执行错误#538:INVALID_SUBRESOURCE_STATE]

我无法将 TLAS 资源的状态更改为,D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE|D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE所以我现在不走运。

我一直在寻找内联光线追踪教程,但它们都只涵盖着色器,而不是 C++ 和根签名的绑定。

如果你有一些提示甚至更好;代码,请帮助我继续前进。

4

1 回答 1

0

我也被这个调试层问题困住了。

创建一个初始状态只有 D3D12_RESOURCE_STATE_NON_PIXEL_SHADER_RESOURCE | D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE标志而没有 D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE标志的加速结构资源消除了错误。

但是,这破坏了The memory must be in state D3D12_RESOURCE_STATE_RAYTRACING_ACCELERATION_STRUCTURE.构建/复制 AS API的规范......

于 2021-11-12T14:13:21.213 回答