使用于平行光,大型场景。
let light=new BABYLON.DirectionalLight('dir',new BABYLON.Vector3(0,-1,1),scene)
light.position.y=10000
var shadowGenerator = new BABYLON.CascadedShadowGenerator(1024, light);
shadowGenerator.getShadowMap().renderList.push(sphere);
camera.maxZ = 1000;
shadowGenerator.splitFrustum();
ground.receiveShadows = true;
//练级数,简单点说就是相机距离越远,阴影变化的次数,从清晰到模糊的过度
shadowGenerator.numCascades=4
//lambda是设置模糊度的
shadowGenerator.lambda=1
//练级混合百分比,就是联级之间的混合过度
shadowGenerator.cascadeBlendPercentage=1
//相机旋转时阴影会跳动,通过设置可以避免跳动,也就是稳定连级
shadowGenerator.stabilizeCascades=true
/*
*启用后,它会提高阴影质量,因为不需要调整不同级联光锥的近
* 平面来考虑远处的阴影投射器。
*请注意,此属性与 PCSS 过滤不兼容,因此在这种情况下不会使用它。
*/
shadowGenerator.depthClamp=true
//启用后不同连级会以不同颜色显示
shadowGenerator.debug=true
freezeShadowCastersBoundingInfo(默认值:false)和 shadowCastersBoundingInfo
启用或禁用阴影投射器和接收器边界信息计算。如果您的阴影投射器和接收器不移动,您可以禁用此功能。如果启用,则每帧都会进行边界框计算,并shadowCastersBoundingInfo
使用数据更新属性。边界信息用于设置级联光锥的最小和最大 z 值。
您可以通过设置属性来提供自己的边界信息shadowCastersBoundingInfo
(不要忘记先禁用自动计算csmShadowGenerator.freezeShadowCastersBoundingInfo = true
!)
autoCalcDepthBounds(默认值:false)
autoCalcDepthBounds
您可以通过设置为来极大地改善阴影渲染(取决于您的场景)true
,但代价是更多的 GPU 工作。
启用后,首先执行深度渲染过程(使用内部创建的深度渲染器或您通过调用提供的深度渲染器setDepthRenderer
)。然后,在深度图上应用最小/最大缩减以计算地图的最小和最大深度值,并将这些值用作setMinMaxDistance()
函数的输入。
将每两帧执行一次计算。但是,它可能会产生一些视觉伪影,因为用于截头分割的值现在落后于实际值一帧,因此请进行测试以查看最适合您的值。
请注意,如果您通过调用提供了自己的深度渲染器setDepthRenderer
,则您有责任自己设置渲染器的刷新率!
使用 时autoCalcDepthBounds = true
,您应该增加lambda
参数的值,甚至将其设置为 1 以获得最佳效果(但实验仍然是最佳选择)。
没有必要使用stabilizeCascades = true
whenautoCalcDepthBounds = true
因为级联拆分是每帧都重新计算的。因此,将此属性设置false
为 以获得阴影贴图中的额外分辨率。
setDepthRenderer
如果您已经在场景中启用了深度渲染器,则应该调用,以避免每帧进行多次深度渲染。如果您提供自己的深度渲染器,请确保它存储线性深度!
请注意setMinMaxDistance()
,如果您通过某些自定义方式知道最小和最大 z 值,您也可以调用自己(最小值和最大值介于 0 和 1 之间的值)。
//您可以通过更新此属性来更改软阴影的“暗度”
shadowGenerator.penumbraDarkess=0.5