我有一个小项目,我正在试验 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++ 和根签名的绑定。
如果你有一些提示甚至更好;代码,请帮助我继续前进。