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



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

我能够将交集渲染成分层无序访问视图 Texture2D 数组,以便光线树的每一层对应于该无人机阵列中的一层。

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

说到重点,有没有办法让我从无人机 Texture2D 资源中回读?有没有办法创建比345599更大的无人机缓冲区?或者,我应该完全解决这个问题的另一种方法吗?

谢谢。

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;

请参阅屏幕抓取和Microsoft文档

最新更新