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

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

我能够将相交渲染成分层的无序访问视图Texture2D数组,因此射线树的每一层都对应于该UAV数组中的一层。

当我尝试从GPU“回读”此数据以便CPU可以读取它时,问题就来了。我还没有找到一种将纹理信息从GPU复制到CPU的方法-我无法在回读堆上实例化2D纹理缓冲区。我现在正在研究将此交集信息写入平坦的1D UAV缓冲区-本质上是g缓冲区。但是,我很难初始化它(由于每个像素可能必定包含一个交集,因此我需要一个缓冲区,其大小为屏幕尺寸* RAY_RECURSION_DEpth(在我的情况下为6),但是UAV缓冲区中的元素数量有限到345599)。

说到重点,我有办法从UAV Texture2D资源中回读吗?我有办法创建一个大于345599的UAV缓冲区吗?还是我应该完全采用另一种方式?

谢谢。

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

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

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

本文链接:https://www.f2er.com/2076987.html

大家都在问