首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于2D纹理无人机的(DX12)读回缓冲区

用于2D纹理无人机的(DX12)读回缓冲区
EN

Stack Overflow用户
提问于 2020-06-23 13:29:34
回答 1查看 917关注 0票数 0

我正在尝试在DXR中读回光线从GPU到CPU的递归路径的光线跟踪交叉点。

我能够将交叉点渲染到一个分层的无序访问视图Texture2D数组中,这样射线树的每一层都对应于这个无人机数组中的一层。

当我试图从GPU“读回”这些数据,以便CPU可以读取它时,问题就来了。我还没有找到将纹理信息从GPU复制到CPU的方法-我无法在读回堆上实例化2D纹理缓冲区。我现在正在考虑将这个交叉点信息写入一个扁平化的1D无人机缓冲区--本质上是一个g缓冲区。然而,我在初始化时遇到了困难(因为每个像素都可能包含一个交集,我需要一个屏幕尺寸*RAY_RECURSION_DEPTH(在我的例子中是6)大小的缓冲区,但是UAV-Buffer中的元素数量被限制为345599)。

说到点子上,有没有办法让我从无人机Texture2D资源中回读?有没有办法创建一个大小大于345599的UAV-Buffer?或者,有没有其他我应该一起去做的方式?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2020-06-24 09:57:42

Direct3D 12的回读资源必须是缓冲区(D3D12_RESOURCE_DIMENSION_BUFFER)。您创建了一个足够大以容纳Texture2D数据(rowpitch * height),然后使用CopyTextureRegion将其从GPU复制到CPU。

代码语言:javascript
运行
复制
D3D12_RESOURCE_DESC bufferDesc = {};
bufferDesc.Alignment = desc.Alignment;
bufferDesc.DepthOrArraySize = 1;
bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER;
bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE;
bufferDesc.Format = DXGI_FORMAT_UNKNOWN;
bufferDesc.Height = 1;
bufferDesc.Width = srcPitch * desc.Height;
bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
bufferDesc.MipLevels = 1;
bufferDesc.SampleDesc.Count = 1;
bufferDesc.SampleDesc.Quality = 0;

请参阅ScreenGrabMicrosoft Docs

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62527920

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档