Babylon.js 第18章 阴影-联级

发布于:2022-12-25 ⋅ 阅读:(654) ⋅ 点赞:(0)

使用于平行光,大型场景。

    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 = truewhenautoCalcDepthBounds = true因为级联拆分是每帧都重新计算的。因此,将此属性设置false为 以获得阴影贴图中的额外分辨率。

setDepthRenderer如果您已经在场景中启用了深度渲染器,则应该调用,以避免每帧进行多次深度渲染。如果您提供自己的深度渲染器,请确保它存储线性深度

请注意setMinMaxDistance(),如果您通过某些自定义方式知道最小和最大 z 值,您也可以调用自己(最小值和最大值介于 0 和 1 之间的值)。

    //您可以通过更新此属性来更改软阴影的“暗度”
    shadowGenerator.penumbraDarkess=0.5

 


网站公告

今日签到

点亮在社区的每一天
去签到