[toc]
# virtual Texture
视频中说,virtualTexture 会以一个中间 Texture 作为查找表来映射原始 Virtual Texturee 与实际 GPU 上存储的的 Physical Texture UV 关系
-
- 这个中间 Texture 实际上是一个查找表
-
- 这个查找表可以在 GPU 上生成
-
- GPU 上实际存储的是从原始 Texture 中填充到 PhysicalTexture 中的大 Texture
# virtual Texture Mipmap
同时,也可以将 mipmap 丢到 Physical Texture 上,同时做几层映射
# Lookup Table 数据解析
每个虚拟查找表代表的是一个虚拟的查找页。
其中每个 uv 坐标代表的是 虚拟页坐标 / 虚拟页大小 (即索引到对应页下的坐标) 页表上每个像素是一个 32bit integer
排布如上图所示:
其中 OffsetX/Y 代表的是物理页的 UV 坐标
mip 代表的是对应物理页的 mip 等级 但是上述数据由于要存储 virtualTexture, 而带世界的 vt 会非常巨大,于是 far cry4 提出了 Adaptive virtual textures (AVT) 的工程方法
# Adaptive Virtual Textures
- 基于 procedural virtual textures
- 10*10KM 的世界被拆分成 64*64 米的段
- 最近的世界 sectors
- 分配虚拟图片到 virtual texture 上 (即将需要渲染的 sector 放到图片上)
- 每个最近的 sectors 实际上是一个较大的虚拟图片 64K*64K 大小的图片 (即 10 像素 /cm)
- 较远的 sector (可以理解为 lod/mipmap)
- 32K
- 16K
- …
- 1K
如上图所示:
篮圈是当前的相机视锥体
红圈是当前的虚拟图片
绿圈是当前视锥体内分配到虚拟图片上的 sector 首先是两个距离相机最近的两个区域,使用 64*64 的像素分配
即 其中图中块的大小就是根据距离相机的距离决定的 值得注意的一点是,由于它是根据距离相机的远近来判断的,所以实际上并不需要使用 LRU 等这一类旧数据剔除方法,而直接判断当前 sector 是否还可以使用,不可以使用就释放掉就行了。
- 如果当前 sector 发生大小转变,则剔除原本的数据,转成新的数据填到图上
# VT 上构造 mipmap
有点没看懂,好像是说原本存储于 Phisycal 上的数据不变,但是会通过 computeShader 对数据进行降采样再写回 RT?
# vt 渲染的挑战
# 降低 PageId 的存储
# 限制每帧渲染开销
如果相机移动的过快,就会导致 pages 变更巨大 (drive/flying)
解决方法,分布式渲染
先渲染 low 的,再慢慢的 upScale. 这也就是为什么我们会在游戏中看到建筑之类的由模糊到清晰的原因
# 大量贴花
= =? 好像讲的不是优化?
# 各向异性过滤
当视角与模型表面有角度差时,可能会出现表面闪烁的问题。解决这个问题的方法就是各向异性过滤
这一节讲的是如何在 Virtual Texture 上支持各向异性过滤 基础不扎实,没看懂为啥扩充边缘就可以支持 8x 各向异性
# 三线性插值
far cry4 的解决方法就是软件闪计算 mip (x) 和 mip (x+1) 的插值