如何在 directx 11 中调整 TextureArray 的大小

How to resize TextureArray in directx 11

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

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

每帧重新创建资源肯定是浪费,所以创建纹理数组和复制肯定不是很有效。

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

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

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

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

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

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

作为旁注,因为您实际上可以一次在多个资源上使用这些图块内存,您可能还需要在您的上下文中发出 TiledResourceBarrier(这通常仅在您的图块同时被多个资源使用时才需要)。

我在我的渲染器中的许多用例中使用了该技术,并取得了一些非常好的内存使用改进。