Sparse virtual textures 学习笔记

Table of Contents

请尊重原作者的工作,转载时请务必注明转载自:www.xionggf.com

Nathan Gauër的Sparse virtual textures

稀疏虚拟纹理概述

sparse virtual texture(SVT)方案是由Id Software提出,用来解决Texture加载问题的一套解决方案,解决了带宽和内存不足的问题。

在Id Software的方案之后,业界又相继提出以下的的方案:

  • Procedural Virtual Texture
  • Adaptive Procedural Virtual Texture
  • Hardware Virtual Texture

稀疏虚拟纹理的历史沿革

最早期的SVT思想,是受Mesh的LOD启发。不同LOD的Mesh对应着不同的网格面数,对应地也应加载不同大小的texture。

在1998年,Tanner发表了一篇《The Clipmap: A Virtual Mipmap》的论文,文中提到了一种叫clipmap的技术。后来被Id Software引入并改进,称之为MegaTexture

clipmap的基本思想是:设置一个mipmap大小的上限,超过这个上限的mipmap会被clip掉,也就是不会加载到内存中

Software Virtual Texture

在MegaTexture的基础上,Id Software提出了virtual texture的概念,这个概念取自于virtual memory。与virtual memory似的是,一个很大的texture将不会全部加载到内存中,而是根据实际需求将需要的部分加载。如下图所示:

内存空间分页示意图

基本思路是:将虚拟纹理的Mipmap chain分割为相同大小的Tile或Page,这里的纹理是虚纹理,然后通过某种映射,映射到一张内存中存在的纹理,这里的纹理是物理纹理,在游戏视野发生变化的时候,一部分物理纹理会被替换出去,一部分物理纹理会被加载。

稀疏虚拟纹理(sparse virtual texture)。简单地说,就是在着色器中重新实现分页pagination),可以拥有无限的纹理,同时保持 GPU 内存使用量恒定。

1 步骤 1 - 手工制作分页


1.1 分页概述


要理解 SVT 如何工作,首先要了解什么是分页:

在大多数计算机上,数据存储在 RAM 中。RAM 是一个线性缓冲区,其第一个字节位于地址 0,最后一个字节位于地址N。因为某些原因,使用真实地址并不方便。因此有人发明了分段segmentation),后来演变为分页。这个想法很简单:使用虚拟地址virtual address),由 CPU 将其转换为实际 RAM 地址。

内存空间分页示意图

在上图中:左侧是虚拟内存,可以看见虚拟内存的地址是线性连续的。共分为4个page。虚拟内存中每个page,都线性映射到page table中的一个entry。

下面举例说明,利用page和page table,如何将一个virtual RAM address(VRA)映射到physical RAM address(PRA)。例子中的page的大小是4KB,即4096个字节。每个虚拟地址VRA,可以用公式表示为:

VRA = PageIndex * 4096 + Offset

其中PageIndex表示该page对应于page table中的第几个entry,从0开始算起。4096就是page的大小4KB,Offset则是该VRA在page中,相对于page起始地址的偏移值。

  1. 假如有VRA为9416,将其除以4096,得到商为2,余为1224。
  2. 上一步得到的商就是PageIndex值,余数就是Offset,这表示,VRA=9416的地址,对应的page table的第2个entry。
  3. 假定第2个entry记录的实际物理页空间的首地址为20480,则PRA = 20480 + Offset = 21704

参考资料

kumakoko avatar
kumakoko
pure coder
comments powered by Disqus