我正在尝试编写我的第一个 DX12 应用程序。我以前没有DX11的经验。我想展示一些刚性和一些柔软的物体。暂时没有纹理。所以我需要在 GPU 中放置一些我以后永远不会改变的顶点/索引缓冲区,还有一些我会改变的。并且场景本身不是静态的,所以一些新对象可能会出现,一些可能会消失。
我应该如何在 GPU 上为其分配/填充/更新内存?我希望看到易于阅读和理解的高级概述,而不是真正的代码。希望问题不要太宽泛。
我正在尝试编写我的第一个 DX12 应用程序。我以前没有DX11的经验。我想展示一些刚性和一些柔软的物体。暂时没有纹理。所以我需要在 GPU 中放置一些我以后永远不会改变的顶点/索引缓冲区,还有一些我会改变的。并且场景本身不是静态的,所以一些新对象可能会出现,一些可能会消失。
我应该如何在 GPU 上为其分配/填充/更新内存?我希望看到易于阅读和理解的高级概述,而不是真正的代码。希望问题不要太宽泛。
你说你是 DirectX 的新手,我强烈建议你远离 DX12 并坚持使用 DX11。DX12 仅适用于已经是专家(具有大 E)和必须推动非常远或具有 DX12 中无法在 DX11 中实现的功能的边缘案例的项目的人。
但无论如何,在 DX12 上,作为初始化缓冲区的示例,您必须创建 ID3D12Resource 的实例。您将需要两个,一个在上传堆中,一个在默认堆中。您使用 Map 填充 CPU 上的第一个。然后你需要使用一个命令列表复制到第二个。当然,您必须使用障碍(复制目标、着色器资源...)来管理资源的资源状态。然后您需要在命令队列上执行命令列表。在销毁上传堆中的资源之前,您还需要添加一个栅栏来监听 gpu 是否完成。
在 DX11 上,您调用 ID3D11Device::CreateBuffer,通过为描述结构提供 SRV 绑定标志和指向要放入其中的 cpu 数据的指针……完成
在处理内存布局时,纹理稍微复杂一些。所以,正如我上面所说,你应该专注于 DX11,它一点也不退化,两者都有其作用。