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起始地址的偏移值。
- 假如有VRA为9416,将其除以4096,得到商为2,余为1224。
- 上一步得到的商就是PageIndex值,余数就是Offset,这表示,VRA=9416的地址,对应的page table的第2个entry。
- 假定第2个entry记录的实际物理页空间的首地址为20480,则PRA = 20480 + Offset = 21704