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