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
相关产品推荐
相关产品推荐

