目标
一般来说,支持大规模纹理的实现方案应满足如下要求:
- 应支持用一个任意大小纹理的一个小的子集进行全速绘制;
- 对纹理子集的快速更新与实时绘制可同时进行;
- 不能导致对场景几何构件的进一步划分或施加其它限制;
- 加载控制必须是健壮的,并能自动避免在过载情况下的视觉不连续现象;
- 纹理的表示应当与现有的应用实现无缝集成;
- 其增加的实现成本相对于现有硬件来说是较小的。
基本思想
对于大纹理,由于硬件的存储和贷款瓶颈的限制,直接生成 Mipmap 很不现实。于是出现了一些方法,如基于原始纹理图像分割的传统方法、Clipmap等。
分割原始纹理的方法即预先把大纹理分割成小的纹理片,每个小纹理片生成 Mipmap,然后根据视野的覆盖范围调度相关纹理片的 Mipmap图组合生成要显示的数据。
Clipmap 是在 Mipmap 基础上的改善。
Mipmaps provide a general but expensive solution when the texture image is very large. clipmaps occupy a small subset of the memory required by equivalent mipmaps, but provide much of the mipmap rendering capabilities. Clipmaps are especially useful for rendering terrain.
Clipmap 的核心思想是对整个纹理先做Mip-Map处理,然后用与纹理缓存大小有关的参数对每一级纹理进行对称裁剪,这样,尖塔形的Mip-Map就成了一个方尖塔形,顶部的尖塔就构成了Cl ip-Map的尖塔,底部的方形区域则构成了一个Clip-Map的栈。Clip-Map的尖塔常驻在纹理存储器中,而栈中的各级仅有一部分存储在存储器中,这一部分是根据视点参数和纹理坐标动态更新的对象。这是一种软硬结合实现大规模纹理实时绘制的方法,为解决这一类问题提供了良好的示范。
用 Clipmap 渲染时跟 Mipmap 非常相似,不同之处在于两点:
- Level-of-detail 选择算法
- texture memory addressing system
Clipmap 的具体介绍请阅读 Tanner 的论文: ClipMap:A Virtual MipMap