Home

Awesome

Implementing Adaptive Virtual Texture in HDRP

alt text

摘要

项目上线了,终于有时间重新梳理,再次复习一下之前的工作,记录一下实现AVT过程中遇到的细节,顺便开源了核心实现,抛砖引玉。希望大佬们多多开源好东西出来大家一起学习进步。

正文

不熟悉Virtual Texture概念和上下文的读者,可以先参阅前辈们的分享,附在文末。

Chen Ka分享的Adaptive Virtual Textures (AVT) 是对Virtual texture应用于超大范围世界的一个改进。举个每米256精度的例子来说传统的2KM地形VT需要一个2K*2K的Indirection Texture来索引Physical Page。在这个例子中,每个indirection pixel代表地形中的一米的格子。这个格子对应一个256*256 pixels的Physical Page。那么Indirection Texture的mip1中的pixel就是2米的地形对应一个Physical Page,刚好Indirection Texture的mip1就是1K*1K,所以Indirection Texture上记录的就是Physical Page atlas的索引,或者说叫Entry。但是当地形无限扩大,精度提升到比如每米1024的时候,我们就会发现Indirection Texture的尺寸会变得非常夸张,比如16KM*16KM每米256的地形就需要16K*16K的indirection pixels。更别说提高地形精度了,每米1024的精度下,每0.25米地形就对应了一个Physical Page。alt text

AVT的思想就是把Virtual Image本身也看成一个动态图集,运行时最多只有2K*2K的Indirection Texture,靠近摄像机的Virtual Image在此间分配256*256 pixels作为Entry,乘上Physical Page size256,就是Chen Ka文中的65536的Virtual Image,64K的Virtual Image贴在64米的sector上就是每米1024的精度。远一些的sector就只分配128*128的pixels,直白一些的解释就是,视距远一些的sector不可能使用到最高精度的mip0,所以可以抛弃掉mip0的Entry,再远一些就只保留mip2即64*64,以此类推,随视距动态切换sector对应的Virtual Image大小,这样Indirection Texture作为一个2K的图集就足够使用了,本文的实现中只使用了1K*1K的Indirection Texture。alt text

这里隐含了一个问题就是最多只能表达每米1024精度下的mip8,即每米4个像素,因为256*256的mip8或者128*128的mip7就只有1个pixel(entry)了。之前以为mip会不够大,视距不够用,思考了很久都没想通,之后实现出来发现aniso8X下mip8已经非常远了,如果配上4K分辨率甚至能到300,400米。其次来说,0-8级mip对于far cry 4来说刚刚好从1米1024texels降低到1米4texels,正好能够衔接远景basecolor的精度每米2texels(😊alt text

开启page边缘显示模式我们可以看到2K分辨率下请求的mip精细很多。 alt text alt text

实现细节

性能测试:

Repo地址:

Reference: