社区
其它游戏引擎
帖子详情
D3D12 资源 维度 复制
DestinedToDie
2019-06-14 05:27:46
我想检查一下纹理里的数据,打算拷贝到内存,最后选择用回读堆,但是回读堆上的资源必须是缓存,要怎么样才能把纹理拷贝到缓冲呢?
...全文
303
8
打赏
收藏
D3D12 资源 维度 复制
我想检查一下纹理里的数据,打算拷贝到内存,最后选择用回读堆,但是回读堆上的资源必须是缓存,要怎么样才能把纹理拷贝到缓冲呢?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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的吧,好像能映射到内存吧
Chapter 18 Cube Mapping
1. **
资源
描述**:首先,你需要定义一个纹理
资源
描述(`D
3D
12
_RESOURCE_DESC`),声明
资源
的类型(这里是立方体贴图),
维度
,格式,以及其他属性,如是否为常量缓冲区,是否有MIP级别等。 2. **分配堆内存**:接着...
D
3D
12
渲染技术之初始化流程
也就是我们通常说的初始化D
3D
12
,D
3D
12
的初始化工作与以前的D
3D
9是完全不一样的,D
3D
12
做了大幅的升级。但是每个D
3D
图形API都有自己的初始化流程,大家只要记住这个流程,学习起来就比较容易,就跟生产车架的流水线...
DirectX
12
(D
3D
12
)基础教程(二)——理解根签名、初识显存管理和加载纹理、理解
资源
屏障
目录 1、前言及本章内容提要 ...4.1、D
3D
12
中创建
资源
的三种方式 4.1.1、提交方式(CreateCommittedResource) 4.1.2、定位方式(CreatePlacedResource) 4.1.3、保留方式(CreateReservedResource) ...
DirectX
12
(D
3D
12
)基础教程(二十)—— 纹理数组(Texture Array)非DDS初始化操作
在本系列教程的DirectX
12
(D
3D
12
)基础教程(五)——理解和使用捆绑包,加载并使用DDS Cube Map中,第一次介绍并引入了基于 DDS 格式的CubeMap的操作和使用方法。在后续示例代码的编写过程中,逐渐发现 DDS CubeMap...
DirectX
12
(D
3D
12
)基础教程(十二)——多线程+多显卡渲染及水彩画效果和标准简化版高斯模糊_d
3d
12
多线程
同时图中没有明显标识出Draw Call的调用,在D
3D
12
的异步渲染框架中,其实Draw Call只是变成了一个命令记录而已,子线程录制命令列表最后一般都会写入一个Draw Call命令,同时每遍后处理最后也会写入一个Draw Call...
其它游戏引擎
456
社区成员
668
社区内容
发帖
与我相关
我的任务
其它游戏引擎
其它游戏引擎
复制链接
扫一扫
分享
社区描述
其它游戏引擎
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章