我正在研究引擎的纹理类,但遇到了一个问题。
我们的 API 支持不同的操作,例如更新纹理的一些纹素和从纹理中读取数据。
此纹理可以作为 UAV 或 SRV 绑定到管道。它也可以创建为 RTV 或 DSV。
我应该如何处理纹理的创建和更新?我应该将所有纹理创建为UPLOAD堆吗?这将是最标准的解决方案,因为我可以轻松地读写数据,但这也意味着更少的 GPU 带宽。
我还可以检测我是从文件创建纹理还是程序纹理,在第一种情况下,我会将纹理上传到默认堆。
你怎么看?
谢谢!
我正在研究引擎的纹理类,但遇到了一个问题。
我们的 API 支持不同的操作,例如更新纹理的一些纹素和从纹理中读取数据。
此纹理可以作为 UAV 或 SRV 绑定到管道。它也可以创建为 RTV 或 DSV。
我应该如何处理纹理的创建和更新?我应该将所有纹理创建为UPLOAD堆吗?这将是最标准的解决方案,因为我可以轻松地读写数据,但这也意味着更少的 GPU 带宽。
我还可以检测我是从文件创建纹理还是程序纹理,在第一种情况下,我会将纹理上传到默认堆。
你怎么看?
谢谢!
您将无法在上传堆中创建纹理,在尝试解决它们时您将面临一个永恒的验证错误循环。这是因为纹理在内存中没有使用线性表示。但至少对您而言,复制和更新操作是您最关心的问题。
当您要在 CPU 和 GPU 之间执行传输时,您需要在上传或回读堆中创建一个缓冲区,GetCopyableFootprints
用于了解如何在其中存储/读取图像并调用CopyTextureRegion
以执行实际复制。如果你想支持部分更新和读取,这是几页代码,但这个操作很简单。
之后,许多考虑因素会影响你的纹理类,你想如何抽象描述符堆中的视图,你想支持部分驻留的保留纹理,你想支持内存别名,你如何管理纹理的生命周期在更新/销毁它们、流式传输等时由 gpu 使用。没有完美的解决方案,这完全取决于您的需求。