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

D3D12使用CreateDDSTextureFromFile12加载立方体贴图后显示全黑求助

问题分析与解决思路

你当前遇到的是D3D12中立方体贴图加载后显示全黑的问题,无报错但NVidia NSight显示资源已上传GPU,以下是常见原因和对应的解决方法:

1. 资源状态未完成转换

DirectX::CreateDDSTextureFromFile12完成数据复制后,目标资源的默认状态是D3D12_RESOURCE_STATE_COPY_DEST,该状态下着色器无法采样资源。需要在命令列表中添加资源状态转换步骤:

在CreateDDSTextureFromFile12调用后插入以下代码:

D3D12_RESOURCE_BARRIER barrier = {};
barrier.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION;
barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
barrier.Transition.pResource = m_cubeMap.Resource.Get();
barrier.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES;
barrier.Transition.StateBefore = D3D12_RESOURCE_STATE_COPY_DEST;
barrier.Transition.StateAfter = D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE;
cmdList->GetCommandList()->ResourceBarrier(1, &barrier);

2. SRV与资源类型不匹配

确认你的DDS文件是真正的立方体贴图格式,而非6张纹理拼接的2D纹理数组。CreateDDSTextureFromFile12会根据DDS文件头自动设置资源的MiscFlags,若文件不是立方体贴图,资源的Desc.MiscFlags不会包含D3D12_RESOURCE_MISC_TEXTURECUBE,此时创建D3D12_SRV_DIMENSION_TEXTURECUBE类型的SRV会导致采样失败。

可在创建SRV前添加检查:

assert((m_cubeMap.Resource->GetDesc().MiscFlags & D3D12_RESOURCE_MISC_TEXTURECUBE) != 0);

若断言失败,需重新生成正确的DDS立方体贴图(比如使用Texconv工具,添加-cube参数)。

3. 着色器采样配置错误

  • 确保采样器的寻址模式设置为D3D12_TEXTURE_ADDRESS_MODE_WRAP,立方体贴图采样依赖正确的寻址模式,否则会出现采样异常。
  • 检查着色器中引用的SRV槽位与管线绑定的槽位一致,确认SRV已正确绑定到根签名对应的位置。
  • 确认着色器中使用TextureCube类型而非Texture2DArray,类型不匹配会导致无法采样到数据。

4. 资源初始化与内存问题

  • 确保m_cubeMap.Resource和m_cubeMap.UploadHeap是ComPtr<ID3D12Resource>类型,且调用CreateDDSTextureFromFile12前未被初始化(函数会自动创建这两个资源)。
  • 检查ShaderHeap分配的SRV句柄是否有效,确保根签名中对应的SRV槽位与分配的句柄位置匹配。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 23:43:12