【地形】【虚拟纹理】地形虚拟纹理技术介绍

  游戏开发中地形是一个绕不开的主题。一种地形方案是地表纹理是一张由美术生成好的大图,这种方式的好处是地形的每一处看起来都不会重复,但当地形变的非常大时,纹理图也会变的更大,一张10kx10k的地图,如果按一厘米每个像素的分辨率,需要的贴图大小将达到10个G,在目前的PC游戏中,这个大小的磁盘空间也许可以接受,但要将这么大的贴图加载到内存还是不太现实的,这时就需要合理的技术来加载需要的纹理,虚拟纹理技术(Virtual Texture)正是可以解决这个问题,其主要思想是假设地形的拥有是一张非常的大的纹理,但纹理坐标对应的是另一块比较的物理纹理上的颜色值。如下图,左边是非常大的虚拟纹理,右边是实际用到的物理纹理,我们将大的纹理切割成一个个小的Tile,将在形当前位置能够看到的纹理按不同miplevel填充到物理纹理中, 当用实际纹理的uv去采样时,实际采样的物理纹理中的一个纹理Tile。

  那么如何得到这些纹理Tile呢? 首先要为大的纹理生成mipmap,如一张64x64的纹理分别生成32x32、16x16、8x8、4x4、2x2、1x1的mipmap纹理,然后将些纹理切割成2nx2n、2n/2x2n/2、2n/4x2n/4... 2n/nx2n/n、20x20数量的块,如64x64大小的纹理,切割成4x4、2x2、1x1大小的块,不能再切割level的mipmap则使用1x1。

 

  现在这些纹理Tile有了,要解决的是地形Mesh如何使用这些Tile,我们同样将地形分割成大小相同的格子,然后将这些格子按四叉树的方式存储,如下图红框中分别为四叉树不同层的结点,四叉树的根节点存储的是最外层红框Chunk,叶子结点存储的是内层红框Chunk信息,由内到外不同层的Chunk分别对应纹理不同miplevel的相同大小的tile块,这样,就可以将这些用到的tile块绘制到物理纹理的tile中。

 

 

  现在还有一个问题,那就是如何计算虚拟纹理到物理纹理的映射。这里可以用一张间接纹理来存储这种关系。下图中间那图即这张间接纹理,它的每个像素对应了地形的每一块,即将地形分成了NxN块,那么间接纹理的大小就是NxN,在间接纹理中,一个像素的RG存储了当前虚拟纹理uv对应在物理纹理中的Tile所在的位置,B存储了当前miplevel级别,A存储一些调试信息。

 

  利用间接纹理中储存的信息,可以计算出物理纹理中的所在的uv值,伪代码如下:

1 IndirectUV = floor(uv * IndirectSize) / IndirectSize;
2 Info = texture2D(IndirectTexture, IndirectUV) * 255;
3 InTileOffset = frac(uv * exp2(MaxMipLevel – info.b));
4 PhysicsUV = (Info.rg + inTileOffset) / PhysicsTileCountXY;

代码中输入值为虚拟纹理中uv,第1行计算出在间接纹理中的IndirectUV值,第2行采样间接纹理,取到物理Tile中的偏移值和MipLevel,第3行计算在Tile块内的偏移,从上图左图中可以看到,当大的Chunk块uv值在相同物理Tile中计算uv时,需要根据MipLevel进行缩放,第4行代码加上了Tile块的偏移,并计算最终物理纹理中采样的PhysicsUV值。

   上面讲到的地形方案中,纹理是预先生成好的,其缺点已经说过,当地形变的很大时,资源量是非常大的,另一种常用地形方案是基于Splat图进行混合的方案。这种方案用每四张splat小图一张controll图的方式进行混合,最终生成丰富的地形表面。

 

   上面的地形就是用中间的controll图对下面splat图进行混合等到的效果,因为这些splat图非常小,并且可以复用,因此这种方案的优点是内存和包体空间占用比较小。但这种方案缺点是纹理采样阶段需要采样的纹理是会变的很多,用八张splat图生成的混合方案最基础的需要2张controll图+8张splat图+8张normal图 = 18次采样,如果加上detail图,采样次数会更多。这时我们以运行时将这些纹理图的采样结果渲染张到两张RT上,一张albedo图和一张normal图,这样我们在每次采样时,只需要对这两个图采样就可以了。同样这里用到了上面提到的虚拟纹理技术,这里称为Procedure Virtual Texture或Runtime Virtual Texture,只是物理纹理中的Tile块不再是从磁盘中读取,而是运行时动态生成的。为了避免一帧内执行大量bake渲染操作,这里可以将bake操作分配到多帧中,同时限制一帧最多bake请求数量,以达到稳定的帧率。

  在实际应用中,还需要考虑Texture Filter问题,还有当地形变的很大时,Adaptive Virtual Texture技术又将虚拟纹理(这里实际是Indirect纹理)生成不同mipmap大小的纹理以减少和内存占用,详细见参考文献。

参考文献:

https://www.bilibili.com/video/av94157267/?vd_source=7583580bcd0cfe490c646c570643fc3b

http://mrelusive.com/publications/papers/Software-Virtual-Textures.pdf

 

posted @ 2022-07-29 15:33  毅安  阅读(1008)  评论(0编辑  收藏  举报