目录 |
1 剔除细节 1.1 LOD组 1.2 多LOD级别 1.3 增量LOD 2 LOD混合 2.1 交叉淡化 2.2 屏幕空间坐标 2.3 裁剪 2.4 抖动 2.5 交叉淡化阴影 2.6 动画抖动模式 3 着色器变体裁剪 3.1 预处理着色器 3.2 仅预处理我们的管道 3.3 计数着色器变体 3.4 剔除级联阴影 3.5 报告剔除的变体 3.6 剔除交叉淡化 |
本文重点:
设计常规和附加LOD组
交叉淡化LOD不同级别
应用屏幕空间抖动
使用动画抖动模式
剔除没有使用的着色器变体
这是涵盖Unity的可脚本化渲染管道的教程系列的第十期。它增加了对交叉过渡LOD组和着色器变体剥离的支持。
本教程是CatLikeCoding系列的一部分,原文地址见文章底部。“原创”标识意为原创翻译而非原创教程。
本教程使用Unity 2018.4.4f1制作。
(抖动去除细节)
1 剔除细节
理想情况下,我们想让渲染尽可能的少。渲染的次数越少,GPU上的压力就越小,这意味着我们可以获得更高的帧速率,并且需要更少的精力来渲染场景。如果某些东西在视觉上变得很小,以至于不再可见(小于单个像素),那么我们可以跳过渲染。当它们仍然可见时,也可以跳过某些方面,因为很小,以至于缺失的时候几乎不会被注意到。因此,我们可以控制场景的细节级别。
1.1 LOD组
创建 level-of-detail 对象的典型方法是为每个 level-of-detail 使用带有子对象的根对象。最详细或最完整的可视化级别称为LOD0。作为示例,让我们创建一个具有单个球形子节点的预制件。与往常一样,我们使用自己的材质,并使用InstancedMaterialProperties组件为其赋予明显的颜色,例如红色。
(具有各种大小的LOD球面实例的场景)
可以通过将LOD Group组件添加到游戏对象的根目录来控制对象的视觉LOD。默认情况下,它具有三个LOD级别。显示的百分比对应于对象的估计视觉尺寸,表示为垂直覆盖的视口数量。只要保持在60%以上,就使用LOD 0,否则它将切换到较低的LOD级别,直到对象被完全剔除到10%以下为止。将球体子级拖动到LOD 0框上,以便将其渲染的图像用于LOD 0可视化。
(LOD球体预制,已选择LOD 0 盒子)
可以通过拖动阈值来调整阈值,也可以通过右键单击它们来通过弹出菜单添加或删除级别。由于我们只有一个LOD级别,因此请删除其他两个。这意味着我们总是显示球体,直到其视觉尺寸降到10%以下为止。至少,没有LOD偏差时就是这种情况。有一个全局LOD偏差可用于调整所有LOD阈值。可以通过代码和项目设置的“Quality ”面板进行设置。例如,将Lod Bias设置为1.5意味着对象的视觉尺寸被相同的因素高估,因此,当我们的球体下降到6.7%以下时,才将其球体剔除。LOD组的检查器将指示存在偏差。
(10%的时候剔除,LOD偏差为1.5)
1.2 多LOD级别
通常,一个对象具有多个LOD级别,每个级别使用一个逐渐简化的网格。要清楚地看到正在使用的不同LOD级别,请复制球状子对象两次以创建LOD级别1和2,并为每个颜色赋予不同的颜色。然后将它们添加到LOD组,例如以15%和10%的阈值将完全剔除移到5%。
(3个LOD级别 球体)
现在,你可以通过移动摄像机或调整LOD偏置来查看正在选择的LOD。
(调整LOD偏差)
LOD组可以与光照贴图一起使用吗?
是。将LOD组标记为静态时,它仍会在LOD级别之间切换,因此静态批处理不适用于它。但是,它确实包含在灯光映射中。LOD 0用于预期的灯光映射,此外,所有其他LOD级别也将获得烘焙照明。至少在使用渐进式光照贴图的情况下。Enlighten在其他LOD级别上存在更多麻烦,需要使用光探针。这也意味着只有静态LOD 0与动态全局照明配合使用。如果动态GI很重要,则应确保其他LOD级别不是静态的,以便它们通过光探头接收GI。
1.3 增量LOD
创建LOD的另一种方法是将其添加到基本可视化中。作为示例,我用立方体和球体创建了抽象树。树的核心被添加到所有三个LOD级别。将较小的树枝,树叶和树皮添加到前两个级别。并且最小的叶子和树皮详细信息仅添加到LOD 0。
(LOD级别为0,1,2)
这与每个LOD级别使用单独的子层次结构相同,除了某些对象是多个级别的一部分。