我正在尝试在DXR中读回光线从GPU到CPU的递归路径的光线跟踪交叉点。
我能够将交叉点渲染到一个分层的无序访问视图Texture2D数组中,这样射线树的每一层都对应于这个无人机数组中的一层。
当我试图从GPU“读回”这些数据,以便CPU可以读取它时,问题就来了。我还没有找到将纹理信息从GPU复制到CPU的方法-我无法在读回堆上实例化2D纹理缓冲区。我现在正在考虑将这个交叉点信息写入一个扁平化的1D无人机缓冲区--本质上是一个g缓冲区。然而,我在初始化时遇到了困难(因为每个像素都可能包含一个交集,我需要一个屏幕尺寸*RAY_RECURSION_DEPTH(在我的例子中是6)大小的缓冲区,但是UAV-Buffer中的元素数量被限制为345599)。
说到点子上,有没有办法让我从无人机Texture2D资源中回读?有没有办法创建一个大小大于345599的UAV-Buffer?或者,有没有其他我应该一起去做的方式?
谢谢。
发布于 2020-06-24 09:57:42
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;
https://stackoverflow.com/questions/62527920
复制相似问题