目录
中文版:https://edu.uwa4d.com/lesson-detail/282/1314/0?isPreview=0
英文原版:https://catlikecoding.com/unity/tutorials/custom-srp/lod-and-reflections/
一、URP LOD 组件
1、LOD Group的使用
1. 首先该组件需要将子类模型置于该组件物体子节点下
2. 可在单个LOD中设置其level的模型,并可设置它的距离范围,即可在不同距离下显示不同的模型
若模型变化时间不符合预期,有如下几种方式调节:
- 重新继续Bound,Unity会根据三种LOD模型计算该模型的包围盒,从而在计算物体占屏幕
2. Project Settings > Quality > Level of Detail > LOD Bias, 该变量增大物体的评估高度,从而导致LOD切换时占比与实践物体占比不同。将 LOD Bias设为1,可以使组件阈值与实际大小同步。
- LOD过渡类型:
- Cross Fade(淡入淡出),Fade Transition Width可调节过渡区域占比
- Cross Fade(淡入淡出),Fade Transition Width可调节过渡区域占比
2、LOD切换原理
Cross Fade(淡入淡出)模式
当启用Cross Fade(淡入淡出)模式,相邻两个LOD对象会同时渲染出来,着色器将以某种方式进行混合。Unity通常使用屏幕抖动或者混合来实现Cross Fade。
在URP通用管线中,LOD现只用于SpeedTree7XXX.shader,即大面积树木的渲染,其余Shader并未使用,但并不代表不可以自定义。
我们可以通过UnityPerDraw
下的变量float4 unity_LODFade;
取得LOD信息
CBUFFER_START(UnityPerDraw)
float4 unity_LODFade;
// x is the fade value ranging within [0,1].
// y is x quantized into 16 levels
CBUFFER_END
- x分量存储过渡因子(逐渐远离消失的LOD对象,x分量从1变换到0;渐入的LOD对象,x分量从0变换到 -1 )
- y分量存储了相同的因子,只不过被量化为16步
即,若渐出LOD的x值为0.4,则渐入LOD的值为 -0.6
我们可以通过一个Noise图来决定使用哪一级LOD的选择。
通过如下内置函数,即可快速得到一个Noise图
float dither = InterleavedGradientNoise(positionCS.xy, 0);
使用屏幕抖动实现LOD混合
void ShadowCasterPassFragment (Varyings input) {
UNITY_SETUP_INSTANCE_ID(input);
ClipLOD(input.positionCS.xy, unity_LODFade.x);
…
}