【问题标题】:How to resize TextureArray in directx 11如何在directx 11中调整TextureArray的大小
【发布时间】:2021-12-20 02:47:06
【问题描述】:

我正在使用 Texture2DArray 来存储我的定向灯的阴影贴图。添加新的定向光时,我想调整纹理数组的大小以能够容纳新的阴影贴图。我怎样才能做到这一点?我需要这个,因为将纹理数组传递给我的着色器并根据光照索引索引正确的纹理非常方便。

我看到的一种可能性是保留多个 Texture2D,在使用所需的着色器渲染之前创建一个 Texture2DArray 并复制到相应的子资源。不过,这对我来说听起来不是很方便和高效。

【问题讨论】:

  • 创建 Direct3D 资源的成本相对较高,因此您可能应该只选择“最大数量的光投射阴影”并预先分配这么多空间。

标签: c++ directx textures directx-11


【解决方案1】:

每帧重新创建资源肯定是浪费,所以创建纹理数组和副本肯定效率不高。

如果每个场景的灯光数量没有真正改变,您仍然可以在场景开始时(加载期间)完全创建一个新资源。

如果您希望它完全动态,您确实必须选择一个最大数量的光,如果您超过该数量,您可以决定创建一个新资源,或者发出一个错误说明您已经超过允许的最大值。

此外,如果您不想过度提交内存(例如,如果您创建一个包含 128 个切片的数组,但只使用 5 个灯会浪费大量 vram),您可以考虑使用 Tiled Resources

这个想法是您预先创建一个大型资源,但没有分配内存。 在它之上,您创建一个带有 Tile 池标志的缓冲区(请注意,在这种情况下,您可以设置零大小,并且大小始终是 65536 的倍数)。

当您需要增加大小时,您可以在缓冲区上使用ResizeTilePool

要将切片池中的内存块分配给纹理,请使用UpdateTileMappings

附带说明,因为您实际上可以一次在多个资源上使用这些磁贴内存,您可能还需要在您的上下文中发出 TiledResourceBarrier(这通常仅在您的磁贴同时被多个资源使用时才需要)。

我在渲染器中的许多用例中都使用了这种技术,并且对内存使用进行了一些非常好的改进。

【讨论】:

    猜你喜欢
    • 2015-07-13
    • 2012-02-04
    • 2019-11-03
    • 2012-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-01
    • 1970-01-01
    相关资源
    最近更新 更多