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