1

试图理解命令列表。好吧,命令列表记录了我用于渲染的命令,还记录了绑定资源,比如说一个带有顶点数据的缓冲区。

m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);

这记录了顶点缓冲区的绑定。此时缓冲区发生了什么?如果我在记录后更改此顶点缓冲区的内容会发生什么?如果我在调用执行命令列表之后更改此顶点缓冲区的内容并且 gpu 尚未完成它会发生什么?

我猜 ExecuteCommandList 是一个异步函数调用,对吗?它是一次执行所有绑定(数据传输到 gpu),还是一一执行命令,甚至所有绑定?命令列表是由驱动程序执行的,还是全部发送到 gpu ?

好吧,因为缺乏好的例子,我还有很多问题。我会很高兴,如果你能回答其中的几个来说明清楚。

4

1 回答 1

1

使用 DirectX 12,同步完全是应用程序的责任。在修改缓冲区之前,您必须插入并检查栅栏以确保 GPU 已完成缓冲区。对于动态缓冲区,您需要进行自己的双/三/n 缓冲。

当您调用时ExecuteCommandList,只需将其排队到 GPU。GPU 实际接收并完成它需要一些时间。

请务必查看DirectX 图形示例 GitHub项目。那里的示例和 Mini Engine 演示是查找示例用法的好地方。

这种设计使 DirectX 12 非常强大,因为它使应用程序可以直接控制 Direct3D 11 运行时中的许多“神奇”事物。也就是说,生成的 API实际使用起来要困难得多,除非您已经是一位足够优秀的图形工程师,可以编写 Direct3D 11 运行时。对于项目来说,使用 Direct3D 11 API 仍然是一个不错的选择。

于 2015-10-29T01:56:51.533 回答