D3D12 资源 维度 复制

DestinedToDie 2019-06-14 05:27:46
我想检查一下纹理里的数据,打算拷贝到内存,最后选择用回读堆,但是回读堆上的资源必须是缓存,要怎么样才能把纹理拷贝到缓冲呢?
...全文
249 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
DestinedToDie 2019-06-16
  • 打赏
  • 举报
回复
这是UAV对应资源的创建
D3D12_HEAP_DESC RTBufferHeapDesc = {
FLOOR(RTBuffer_Size, static_cast<UINT64>(256)),
{D3D12_HEAP_TYPE_DEFAULT,D3D12_CPU_PAGE_PROPERTY_UNKNOWN,D3D12_MEMORY_POOL_UNKNOWN},
D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT,
D3D12_HEAP_FLAG_NONE
};
ThrowIfFailed(Device->CreateHeap(&RTBufferHeapDesc, IID_PPV_ARGS(&RT_ResultHeap)));



D3D12_RESOURCE_DESC RTBufferDesc = CD3DX12_RESOURCE_DESC::Tex2D(
RenderTargetFormat, Width, Height);
RTBufferDesc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS;
RTBufferDesc.DepthOrArraySize = 1;
ThrowIfFailed(Device->CreatePlacedResource(
RT_ResultHeap.Get(),
0,
&RTBufferDesc,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
nullptr,
IID_PPV_ARGS(&CS_ResultResource)));
#ifdef _DEBUG
ThrowIfFailed(CS_ResultResource->SetName(L"RT"));
#endif // _DEBUG
DestinedToDie 2019-06-16
  • 打赏
  • 举报
回复
这是用于拷贝的代码块
{
ComPtr<ID3D12Resource> Reader = nullptr;
D3D12_HEAP_PROPERTIES Prop = {};
Prop.Type = D3D12_HEAP_TYPE_READBACK;
D3D12_RESOURCE_DESC Desc = CD3DX12_RESOURCE_DESC::Buffer(RTBuffer_Size);

Device->CreateCommittedResource(
&Prop,
D3D12_HEAP_FLAG_NONE,
&Desc,
D3D12_RESOURCE_STATE_COPY_DEST,
nullptr,
IID_PPV_ARGS(&Reader)
);
D3D12_TEXTURE_COPY_LOCATION Src = {}, Dst = {};
Src.pResource = CS_ResultResource.Get();
Dst.pResource = Reader.Get();
Dst.Type = D3D12_TEXTURE_COPY_TYPE_PLACED_FOOTPRINT;
DirectGraphicsCommandList->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
XMVECTOR* pData = nullptr;

{
Barrier = CD3DX12_RESOURCE_BARRIER::Transition(
CS_ResultResource.Get(),
D3D12_RESOURCE_STATE_UNORDERED_ACCESS,
D3D12_RESOURCE_STATE_COPY_SOURCE);
DirectGraphicsCommandList->ResourceBarrier(1, &Barrier);
}

ThrowIfFailed(Reader->Map(0, &D3D12_RANGE({ 0,RTBuffer_Size }), reinterpret_cast<void**>(pData)));
for (UINT64 i = 0; i < RTBuffer_Size / sizeof(XMFLOAT4); i++)
{
if (pData == nullptr)
{
break;
}
if (XMVector4Length(*pData).m128_f32[0] >= 0.01f)
{
OutputDebugStringA("Found not-zero pixel");
}
pData++;
}
Reader->Unmap(0, &D3D12_RANGE({ 0,0 }));
{
Barrier = CD3DX12_RESOURCE_BARRIER::Transition(
CS_ResultResource.Get(),
D3D12_RESOURCE_STATE_COPY_SOURCE,
D3D12_RESOURCE_STATE_UNORDERED_ACCESS);
DirectGraphicsCommandList->ResourceBarrier(1, &Barrier);
}
}
DestinedToDie 2019-06-16
  • 打赏
  • 举报
回复
那我等会贴一下可能也没什么人像我这样做
WJN92 2019-06-16
  • 打赏
  • 举报
回复
没遇到过这样的问题,你又不贴一下代码
DestinedToDie 2019-06-15
  • 打赏
  • 举报
回复
我的UAV在默认堆里不能直接Map()
DestinedToDie 2019-06-15
  • 打赏
  • 举报
回复
但是CopyBufferRegion()CopyTextureRegion()CopyResource()都有维度要求,回读堆又不能是纹理
DestinedToDie 2019-06-15
  • 打赏
  • 举报
回复
对啊UAV里的2D纹理
WJN92 2019-06-15
  • 打赏
  • 举报
回复
你应该是用uav的吧,好像能映射到内存吧

456

社区成员

发帖
与我相关
我的任务
社区描述
其它游戏引擎
社区管理员
  • 其它游戏引擎社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧