![[Unity] Unity层级细节(LOD)的使用,第1张 [Unity] Unity层级细节(LOD)的使用,第1张](/aiimages/%5BUnity%5D+Unity%E5%B1%82%E7%BA%A7%E7%BB%86%E8%8A%82%EF%BC%88LOD%EF%BC%89%E7%9A%84%E4%BD%BF%E7%94%A8.png)
下面我们分步骤来构造一个最简单的LOD模型示例:
步骤1:准备3组模型,高精度模型,中精度模型,和低精度模型,并按照复杂程度自高向低的为模型命名,如“模型名称LODO0”、“模型名称LOD1”等,最后的数字序号越低,表示复杂程度越高。如图所示:
步骤2:定义一个空对象,添加LODGroup组件,如图所示:
步骤三:分别将刚刚准备好的三种不同精度的模型,拖拽到空对象的LODGroup组件的各个级别上。首先给LOD组件的“LOD 0”(LOD 0 表示摄像机最近距离显示)添加对应的模型。(LOD 0 对应高精度模型,然后拖拽到Add上面即可)如图所示:
步骤四:在LOD组件添加模型的过程中会d出如图所示的提示信息,表明要把添加的模型作为LODGroup组件所属对象的子物体,单击"Yes,Reparent"按钮即可。
步骤五:为使构造的LOD游戏对象显示得更加自然,需要把LOD下的三个子物体进行”对齐“处理。(将其相对于父物体的坐标置为0)如图所示:
步骤六:在Scenes视图中,拖动摄像机分别近距离与远距离观察模型的变化。
注:Project Settings中与LOD组件相关参数
LOD Bias和Maximum LOD Level
- 执行unity编辑器菜单:Edit >Project Settings >Quality,会打开Quality Setting窗口 ,找到Other下的参数,如图所示:
Maximum LOD Level:是最大LOD级别,表示游戏中使用的最高LOD级别。在该级别以上的模型不会被使用,并且在编译时忽略。(这将节省存储空间和内存空间)。
Bias LOD:LOD偏离 ,LOD级别基于物体在屏幕上的大小。当物体大小在两个LOD级别之间,可以选择使用低细节模型或高细节模型。数值取值范围为0-1,数值越接近0,越偏向于选择低细节模型。大白话描述即是:如果该值小那么,摄像机离物体距离稍微有些变化,不同细节物体即会切换,该值大,那么摄像机需要与物体有很大的距离才会切换。
https://catlikecoding.com/unity/tutorials/custom-srp/lod-and-reflections/
离远时,细节过多的物体会因太小而模糊不清,最好的方式就是不渲染它们,让CPU内存占用减少,让GPU渲染更为重要的东西。我们也可以提前剔除这些物体,不过突然剔除可能会造成视觉问题,我们可以添加一些中间过渡的状态,Unity使用LOD(level of detail)组来完成。
我们可以创建一个空对象,然后添加一个 LODGroup 组件:
百分比即物体在窗口中的占比。我们可以点击任一LOD级别,然后赋予一个要显示的物体。
LOD组的渐变模式有 Cross Fade 和 Speed Tree ,Corss Fade即交叉渐变,会提前显示下一LOD级别的物体,交叉过渡,Speed Tree用于 Speed Tree 的树,可在网格和公告板间过渡。
切换为 Cross Fade 后,我们可以点击任一LOD级别,调节 Fade Transition Width 滑条,数值越低越早混合,0表示不混合,1表示立即切换。
开启交叉渐变后,会同时渲染两个LOD级别,我们需要在对应的shader中添加相应关键字生成shader变体:
物体的渐变程度可由 UnityPerDraw 缓冲中的 unity_LODFade 获得,X组件是渐变因数,比如可以这样观察LOD渐变因数:
我们可以开启 Animate Cross-fading 选项,这样的渐变符合平滑动画曲线。默认的动画时间是0.5s,我们可以通过 LODGroup.corssFadeAnimationDuration 属性修改长度。
向场景中添加细节的另一种方式是添加环境高光反射,这对于金属度高的表面来说非常重要。
我们已经支持了漫反射全局光照,取决于BRDF的漫反射颜色,现在添加高光全局光照。添加一个 IndirectBRDF 方法,一开始只返回漫反射光:
在一开始添加反射光颜色,包括GI高光和BRDF高光颜色:
使用粗糙度散射这些反射,我们除以粗糙度的二次方,防止分母为0加1:
在 GetLighting 中替换直接计算的间接光漫反射:
最常见的环境就是天空盒,可通过 unity_SpecCube0 获得相应立方体贴图纹理:
添加一个采样方法 SampleEnvironment ,方法中使用 SAMPLE_TEXTURECUBE_LOD 来采样,最后一个参数是mipmap级别,这里先设为最大mipmap级别:
我们需要通过反射光方向来采样,而这个我们可看见的反射光方向也就是观察方向的反射:
然后,在GI中添加高光属性,在 GetGI 中采样获得:
之后在 GetLighting 中的 IndirectBRDF 中传入正确的GI高光颜色:
想起作用的话,需要配置逐物体数据标志:
粗糙表面不仅会散射高光的强度,还会为高光添加一定的混乱度。Unity通过使用较低级别的mipmap模糊环境贴图来模拟这些效果。为得到正确的mipmap等级,我们需要知道人所感知的粗糙度。将其添加到BRDF结构体中:
我们使用 PerceptualSmoothnessToPerceptualRoughness 来获得感知粗糙度,然后获得我们想要的表面粗糙度,这些方法定义在 Core RP 的 CommonMaterial.hlsl 中:
接着我们通过定义在 ImageBasedLighting.hlsl 中的 PerceptualRoughnessToMipmapLevel 来获得正确的mipmap级别:
PerceptualRoughnessToMipmapLevel :
然后在 GetGI 和 LitPassFragment 中应用:
表面的一种属性是当沿着掠射角观察时,会看起来完全是镜面,这种现象称之为菲涅尔反射。真实的菲涅尔非常复杂,我们用一种模拟边界的方式来模拟菲涅尔效应。
这里使用Schlick的模拟的变体:
在 IndirectBRDF 中,我们用1-法线与观察防线的点积来影响菲涅尔的强度,并进行4次幂运算:
然后使用菲涅尔强度在菲涅尔颜色和高光间插值:
在shader中添加相应的属性:
在 LitInput 中声明相应的变量:
在 Surface 结构体中添加菲涅尔强度的属性:
在 IndirectBRDF 中应用:
默认的环境立方体贴图只包含天空盒,不包含场景中的其它物体。为了反射所有东西,我们可以添加反射探针, GameObject/Light/Refelection Probe 。反射探针从它所在位置将场景渲染到一个立方体贴图中,因为与位置有关,往往需要在场景中防止多个反射探针:
反射探针的类型默认设置为 Baked ,即只渲染一次,我们还可以设置为 Realtime 。
场景中根据物体的摆放,我们设置多个反射探针,但这也意味着可能会破坏GPU批处理。
物体的 MeshRenderer 中的 Anchor Override 可以用来调整物体使用哪个探针:
反射探针也有多种混合模式可以选择,默认是 Blend Probes ,即可以在最佳的两个反射探针间混合,但该模式不支持SRP批处理。因此,目前暂时仅支持关闭 Off ,以及 Simple ,选择最重要的探针。
立方体贴图数据可以是LDR或HDR的,要HDR的话,可以这么声明:
然后使用 DecodeHDREnvironment 来解码:
unity远处纹理看不到是因为设置了LOD了,或者是渲染选项做了设置。仔细检查发现并没有。只好开始Google。最后确定,是【贴图设置】中的【Generate Mip Maps】选项被勾选了。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)