You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DirectX 12切换Compute与DXR管线后DispatchRays报错求助

问题分析与解决方案

核心原因

报错本质是:光线追踪管线的根签名仍在引用计算阶段的描述符句柄(指向Compute Heap),但当前命令列表激活的是DXR Heap。你切换到DXR堆后,未重新绑定光线追踪的根签名与对应描述符表,导致管线资源引用不匹配。

修复步骤

  1. 显式设置光线追踪根签名
    计算、光线追踪、光栅管线的根签名相互独立,切换到DXR管线时必须调用SetRaytracingRootSignature,不能沿用之前计算阶段的根签名。

  2. 重新绑定DXR根描述符表
    切换描述符堆后,需将DXR堆的描述符表绑定到光线追踪根签名的对应槽位,确保所有资源引用指向当前激活的DXR Heap。

修改后的渲染流程代码:

commandList->SetPipelineState(computeShaderState);
commandList->SetComputeRootSignature(computeShaderSignature);
commandList->SetDescriptorHeaps(1, &computeHeap);
commandList->SetComputeRootDescriptorTable(0, computeHeap->GetGPUDescriptorHandleForHeapStart());

// 计算调度参数
UINT xwidth = static_cast<UINT>(ceil(texWidth / 32.f));
UINT xheight = static_cast<UINT>(ceil(texHeight / 32.f));
commandList->Dispatch(xwidth, xheight, 1);

// 插入资源屏障:确保计算着色器写入完成后再执行后续操作
commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::UAV(noiseTexture));

// 复制纹理到DXR堆对应的资源(注意复制前后的资源状态转换)

// 切换到DXR管线
commandList->SetPipelineState1(dxrState);
// 新增:绑定光线追踪根签名
commandList->SetRaytracingRootSignature(dxrRootSignature);
commandList->SetDescriptorHeaps(1, &dxrHeap);
// 新增:绑定DXR根描述符表(根据你的根签名结构调整槽位)
commandList->SetRaytracingRootDescriptorTable(0, dxrHeap->GetGPUDescriptorHandleForHeapStart());

// 转换输出纹理状态
// 构建DispatchRays描述

commandList->DispatchRays(&dxrDesc); 

// 切换到光栅管线绘制ImGUI
commandList->SetPipelineState(rasterState);
commandList->SetGraphicsRootSignature(rasterRootSignature);
commandList->SetDescriptorHeaps(1, &rasterHeap);
// 绘制ImGUI内容

额外注意事项

  • 资源状态同步:计算着色器写入UAV后,必须插入UAV类型的资源屏障,确保GPU完成数据写入后再执行复制或光线追踪操作,避免数据竞争。
  • 根签名独立性:三种管线的根签名不能互相替代,切换时必须显式设置对应类型的根签名(SetComputeRootSignature/SetRaytracingRootSignature/SetGraphicsRootSignature)。
  • 描述符堆完整性:当前激活的描述符堆必须包含根签名中所有绑定的资源描述符,否则会出现句柄不匹配错误。

内容的提问来源于stack exchange,提问作者rasqall

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 11:47:14