Version: 2020.1
Using Streaming Virtual Texturing in Shader Graph
Marking textures as "Virtual Texturing Only"

Cache Management for Virtual Texturing

Virtual Texturing uses fixed-size texture caches in GPU memory. There is one cache per graphics format. You can configure the default size of a cache and overwrite its default size.

The Streaming Virtual Texturing (SVT) system also uses one CPU cache in main memory to store tile pages. A tile page contains multiple tiles that the SVT system reads all together from disk into the CPU cache. This increases the speed of the read throughput from disk on slower drives. When the Virtual Texturing system requests a tile, it reads the page that contains that tile. It’s likely that the system will request other tiles in that page in the following frames, so the CPU cache retains that page to avoid another read from disk. The larger the CPU cache size, the longer Virtual Texturing can keep the page in main memory.

Virtual Texturing allocates the GPU cache of a given graphics format when it renders a Material that has a Texture Stack with a texture that uses that format. You can configure the cache size (in MB) on the HDRP Asset, which allows you to have different configurations for each quality level.

You can also use the VirtualTexturing.Streaming.SetGPUCacheSettings method to set the cache size in a script.

You can change the cache size, but this results in resource-heavy CPU and GPU operations, and blocks both the main thread and the render thread. The length of time it takes to change the cache size depends on the size and number of caches. To avoid noticeable freezes or stuttering, you should change the cache size at a time when frame rate is less important (such as when loading a level).

The main factors that influence the optimal size of a given cache are the output screen resolution, and the number of layers in each Texture Stack that use that graphics format. The number of Materials in the scene and the resolution of the textures don’t influence the optimal size as much. For a full HD screen resolution on the highest quality setting, the combined total GPU cache size is typically 700MB.

An issue called “cache thrashing” occurs when the size of a cache is too low to accommodate its contents, and it must load and unload tiles in the same frame. To prevent cache thrashing, the Virtual Texturing system automatically reduces texture quality as needed. It monitors cache usage, and automatically manages a mipmap bias for the Texture Stack sampling in pixel shaders. If the cache fills up, the mipmap bias increases. This ensures that the Virtual Texturing system requests lower resolution tiles, which saves space in the cache, allowing it to contain all of the requested tiles.

If your textures look blurry, try increasing the size of your caches. If the caches are already large enough to render frames at the highest quality, further increasing the cache size means that the cache can retain tiles for longer before evicting them. This can reduce unwanted effects such as texture popping when you move or turn the Camera, because tiles that were recently visible are more likely to still be in the cache.

Using Streaming Virtual Texturing in Shader Graph
Marking textures as "Virtual Texturing Only"