【LOD for 3D Graphics】LOD技术背景调查


1. LOD 的三种基础框架

  1. Discrete LOD
  2. Continuous LOD
  3. View-Dependent LOD

1.1 Discrete LOD

我们将传统的LOD方法称为离散LOD. 简单来说就是一般理解上的 LOD, 离线生成一系列具有不同细节层次的对象, 然后在运行时选择合适的LOD进行渲染. 在图形程序中有广泛应用.

由于是通过预处理生成 LOD, 无法预测运行时对模型的观察方向, 所以在简化模型的时候一般都是做均匀的简化. 所以这种 LOD 有时也被称为各向同性或视线无关的 LOD(isotropic or view-independent LOD)

优势: 运行时的处理非常简单. 因为是预处理, 所以 LOD 的生成也会比较灵活

1.2 Continuous LOD (Progressive LOD, 渐进式 LOD)

Continuous LOD 是 Discrete LOD 的一个改进. 简化程序生成一个数据结构来对连续的细节范围进行编码, 然后运行时程序可以根据这个数据结构产生合适的细节层次.

优势: 更好的颗粒度. 由于不是从几个预先生成的层次中选择, 所以不会产生不必要的多边形.

1.3 View-Dependent LOD

View-Dependent LOD 又是对 Continuous LOD 的一个补充, 在 Continuous LOD 的基础上再结合当前的视角选择更加合适的 LOD 层级. 因此这种 LOD 是各向异性的. 比如一个模型距离摄像机比较近的部分拥有比远处更高的"分辨率"

优势: 在 Continuous LOD 的基础上进一步优化 LOD 颗粒度. 而且诸如像地形这种非常巨大的模型, 不使用 View-Dependent LOD 通常无法进行简化. 基于视图的LOD可以实现交互式渲染, 而无需人工干预或进行额外的分割处理.

1.4 LOD 实践

尽管 Continuous LOD 和 View-Dependent LOD 有好处, 但是传统的 Discrete LOD 依旧被广泛应用. 前两种方法虽然有好处, 但是缺点同样明显. 他们需要在运行时进行估算, 简化, 优化模型等等操作, 而用来编码的数据结构也同样需要占用额外的内存.


2. LOD 选择因素

很明显, 对于 LOD 技术而言最重要的问题是什么时候切换到分辨率更低或更高的模型上. 直观上距离越远或者越小的模型应该使用越低的分辨率. 这看上去很简单, 但其实一个模型到底需要多小或者多远时就要进行 LOD 切换并不是那么容易确定. 接下来我们分析几种影响 LOD 选择的因素.

2.1 距离

划定不同的距离范围阈值, 根据距离, 使用不同的 LOD 层级. 根据距离选择 LOD 是直接而简单的, 运行时开销也比较小. 但是尽管这很简单, 但是依然有一些缺点. 比如计算距离时选取不同的点则会产生不同的结果, 模型的缩放, 透视投影的参数等原因会导致原先设置的值失效.

最佳的解决方案是计算到距离观察者最近的物体上的点的距离.

2.2 尺寸

Distance-based 使用空间上的距离来选择 LOD 层级. 由于物体距离观察者越远, 在屏幕上投影的面积越小, 所以与 Distance-based 类似, Size-based 使用一系列尺寸范围阈值, 根据物体投影到屏幕上的覆盖面积, 选择不同的 LOD 层级.

Size-based 技术避免了 Distance-based 的一些问题. 比如缩放, 投影等.

Size-based 提供了更加通用和准确的手段来筛选 LOD 层级, 但是代价就是相较于 Distance-based 计算开销要更大, 一般会计算物体包围盒八个顶点投影到屏幕的变换, 然后再计算出 2D 包围盒的面积.

另外他也有自身的问题, 比如一个旋转的薄片模型, 其投影到屏幕的面积在旋转时会急剧变化, 这对 LOD 层级的选择会造成一定的影响. 使用包围球而不是 AxisAlignedBoundBox 可以减小这种特殊情况的影响. 但是由于包围球对模型的拟合程度较差, LOD 层级的选择会比较保守. 已经有很多的研究人员使用更加复杂的边界体积来提供更好的模型拟合.

2.3 优先(Priority)

场景中某些物体具有独特的重要性, 对其进行 LOD 降级甚至剔除会大幅影响场景的视觉表现. 我们可以通过优先级设置来控制特定物体的 LOD 不发生过分的降级.

2.4 滞后(Hysteresis)

Hysteresis 是指当对象移动到比阈值更远一点的位置时再切换到低层次 LOD(或者当对象移动到比阈值更近一点的位置时再切换到高层次 LOD). 这样做是为了减少对象在阈值附近徘徊, LOD 在两个层级之间不停切换导致的闪烁.

有研究人员发现滞后的数值设置为每一个 LOD 距离范围的 10% 具有比较好的效果.

2.5 感性因素(Perceptual Factors)

研究人员已经观察到3D图形系统应该更多地基于人类视觉系统的工作原理,而不是针孔相机的工作原理。在计算机图形学中通常会忽略许多可能影响我们在不同情况下可以感知的细节量的感知因素。例如,对于周围视觉中的物体或在视线中快速移动的物体,我们可以感知的细节较少。因此,我们可以想象在这种情况下降低对象的分辨率,提高帧速率而不会出现明显的退化。


3. 游戏优化

3.1 游戏环境

  1. 稳定的帧率
  2. 紧张的内存资源
  3. 实例化, Instantiation, 创建一个cache, 相同的对象只引用cache而没有自身的内存占用
  4. 可扩展平台, 指不同性能平台的适配, 比如添加bias, 设置最高访问层级等手段
  5. 填充率与三角形率, 面数瓶颈的情况下, LOD将带来明显的收益
  6. 平均三角形尺寸, 少量的大三角形会将更多的负担转移到像素后端, 而大量的小三角形将首先增加几何前端负担, 平均三角形尺寸用来指导前后端负载平衡.

3.2 LOD 在游戏中的应用

3.2.1 Discrete LOD
  1. 离线生成高可用的 LOD
  2. 共享顶点数据使用多组索引, 可以减少内存的消耗
  3. 不共享顶点数据则带来 LOD 不同层级之间模型的灵活性提升
  4. 自动vs手动, 离散 LOD 可以让美术人员定制每一个 LOD 层级, 但是如果使用共享顶点数据技术则对美术人员制作底层 LOD 模型的操作有所要求. 问题是美术使用的建模工具很可能不支持这种操作, 这是就需要找到一个能让游戏性能和美术效果都打到要求的自动模型简化工具. 这一复杂性也是不共享顶点数据时的优势.
3.2.2 Continuous LOD

连续 LOD 在现阶段来看一般用于地形 LOD, 与基于离散 LOD 的应用场景比较, 可以说是另一个领域, 涉及到的问题差异比较大, 做到的时候再议.

3.2.3 阴影 LOD

拥有 LOD 之后, 实时阴影可以使用某一低层级的 LOD 模型来生成, 在不产生明显穿帮的前提下可以在一定程度上加速阴影计算

3.3 非Geometry LOD

3.3.1 Per-Pixel Costs

性能优化我们主要着眼于两种优化: Geometry 处理和像素填充率. 我们到现在为止讨论的方案都是在保证像素填充不变的情况下降低 Geometry 处理的消耗, 幸运的是当对象变远的时候在屏幕上会自然而然的变小, 从而降低像素填充率. 在这种自然减少的优化力度还不够的时候可以考虑 Shader LOD 技术.

每像素成本虽然受平台,设备等因素影响比较大, 但是仍然可以做出一些一般性结论. 比如在支持多重纹理的平台上, 绘制单个像素的成本随引用的纹理数量线性增加或减少. 因此访问四个纹理的pixel shader几乎比访问一个纹理的pixel shader慢四倍. 另外切换shader造成的状态切换也会导致一定的消耗.

因此可以为着色shader添加多条code path, 每一个path表示一层LOD. 不断减少shader中的效果, 在极远处甚至能够降低为输出纯色, 这是最快的像素填充方法.

3.3.2 Effect Scaling

比实时如阴影, 在近距离可以生成高质量阴影, 稍远出可以使用预先生成好的大致轮廓生成阴影, 再远处可以直接替换为阴影片, 极远处直接关闭阴影. 所有这些都是有效的阴影生成方法,但是只有在近距离时才能完全欣赏到更精确的效果。正如应用于对象的着色器可以随着距离的增加而退化一样,当对象的重要度降低时,应用于对象的效果也可以退化或消除.

例子特效也是同样的道理, 在近处用 1000 个 billboard 模拟的精致烟雾效果, 在远处可以用 100 个稍大的 billboard 模拟而无需在意细节上的损失.

3.3.3 Lighting LOD

Geometry LOD致力于降低顶点和面的数量, 这对每个顶点的光照计算没有优化, 当使用像素光照的时候甚至几乎没有任何作用. Lighting LOD 则致力于处理这种情况.

一般的正向渲染引擎在计算光照时, 光源的数量会极大的影响效率, 所以引擎会限制同时作用于一个模型的光的数量. 但是随着模型变得越来越远, 降低最大受光数量限制也是有效的. 由于对象远离观察者导致受光越来越少, 这时可以将光的贡献平均到环境光中, 以此降低模型远离时越来越暗所带来的突兀感.

另外也可以在模型远离时将复杂的光照计算替换为更简单近似. 比如将 pbr 光照替换为简单的 Lambert 光照, 点光替换为方向光, 甚至最终降级为环境光, 在极远处完全消除照明的成本.

3.3.4 Transformation LOD

无论是GPU蒙皮还是CPU蒙皮, 顶点在进行变换的时候都是由若干个矩阵(通常不大于4)控制的. 同样的, 在模型远离的时候, 我们可以通过忽略权重较低的矩阵, 限制起作用矩阵的数量等手段来降低顶点变换造成的损耗.

3.3.5 Object Priority

游戏中不同的物体通常可以设定不同的优先级, 比如装饰品, 地面上的诸如碎石灌木的小物件等都可以将优先级设置的比较低, 用更为强势的 LOD 进行处理. 由于他们本来就不占据视觉主体, 所以不会有明显的穿帮.

3.4 替身

旨在用各种方式方法(预处理 or 实时都可以)生成基于图片的替身片, 用来代替远处的模型渲染.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值