可以使用本机插件接口从 GPU 上复制本机顶点缓冲区吗?
我特别询问directx12,vulkan,metal我知道这可以用directx11完成。此外,我只询问 2021.2 之前的 Unity 版本。
我可以使用以下 API:
ID3D12GraphicsCommandList::CopyResource
或者
ID3D12GraphicsCommandList::CopyBufferRegion
在directx12的情况下,
或者
vkCmdCopyBuffer
如果是 vulkan,或者无论ResourceBarrier (dx12) 或AccessMode (vulkan) 是什么,我都会尝试将其应用于资源。
我确实尝试使用统一提供的命令队列以及创建自己的复制队列来运行一些测试代码,但没有任何反应。我只能怀疑这与本机缓冲区的资源状态有关,但我无法确定。
因为 Unity 没有发布任何关于本机网格缓冲区的初始资源状态 (StateBefore) 的信息,更不用说任何关于GetNativeVertexBufferPtr()
根据当前获得的指针实际可以做什么的信息GraphicsDeviceType
(除了简单的示例 @github)我感觉我不得不求助于发布这些问题。
编辑我将尝试根据需要提供更多详细信息
我正在尝试实现与Graphics.CopyBuffer()
Unity 2021.2+ 中提供的功能类似的功能,仅适用于该版本之前的 Unity 版本。
我想复制从返回的指针指向的缓冲区的内容,Mesh.GetNativeVertexBufferPtr()
以表示从GraphicsBuffer.GetNativeBufferPtr()
or返回的缓冲区ComputeBuffer.GetNativeBufferPtr()
。(缓冲区确实具有匹配的大小和步幅)。
重要的是不要使用任何可以将此数据取回托管内存的方法,而是直接在 GPU 上进行。
我已经设法DirectX11
使用此接口使用本机插件来做到这一点:
Github - Unity-Technologies/NativeRenderingPlugin
但是当我尝试这样做DirectX12
或Vulkan
使用上面提到的方法时,我做不到。因为示例插件代码库中的 Unity 在线手册和注释提供的帮助很少,我无法猜测可能是什么问题。
有谁确切地知道这种事情是否可以完成,或者我是否试图用 Unity 配置其网格的本机缓冲区的方式来做一些绝对不可能的事情?