阴影生成器
创建阴影
babylonjs用阴影生成器创建阴影。
//创建阴影生成器,size为number越大阴影分辨率越高,light为产生阴影的光源
var shadowGenerator = new BABYLON.ShadowGenerator(size, light);
//为mesh添加阴影
shadowGenerator.getShadowMap().renderList.push(mesh);
//也可以这样,includeDescendants是一个bool值,表示是否为mesh的子对象添加阴影
shadowGenerator.addShadowCaster(mesh,includeDescendants)
//去除mesh的阴影
shadowGenerator.removeShadowCaster(mesh,includeDescendants)
//让地平面能被投射阴影
ground.receiveShadows = true;
阴影滤镜配置
为阴影配置滤镜,可以用来抗锯齿。
shadowGenerator.usePoissonSampling = true; //为阴影添加泊松分布采样滤镜
shadowGenerator.useExponentialShadowMap = true; // 指数阴影贴图,默认开启
shadowGenerator.useBlurExponentialShadowMap = true;//有最好的阴影抗锯齿效果,但也最慢
shadowGenerator.usePercentageCloserFiltering = true;//PCF,webgl2可用,在加载性能上有很大提升
shadowGenerator.filteringQuality = BABYLON.ShadowGenerator.QUALITY_LOW;//可以通过手动降低滤镜质量来进一步提高性能
Close Exponential Shadow Map (CESM)
//为物体设置自体阴影
shadowGenerator.useCloseExponentialShadowMap = true;
//加了滤镜的自体阴影
shadowGenerator.useBlurCloseExponentialShadowMap = true;
透明阴影
根据物体透明度生产成带透明度的阴影
shadowGenerator.enableSoftTransparentShadow = true;
shadowGenerator.transparencyShadow = true;
层叠阴影生成器
创建
Cascaded Shadow Maps (CSM)只在directional light中可用,用于解决渲染大场景时候的阴影边缘锯齿问题。
//创建层叠阴影生成器,size为number越大阴影分辨率越高,light为产生阴影的光源
var csmShadowGenerator = new BABYLON.CascadedShadowGenerator(size, light);
//为mesh添加阴影
csmShadowGenerator.getShadowMap().renderList.push(mesh);
//也可以这样,includeDescendants是一个bool值,表示是否为mesh的子对象添加阴影
csmShadowGenerator.addShadowCaster(mesh,includeDescendants)
//去除mesh的阴影
csmShadowGenerator.removeShadowCaster(mesh,includeDescendants)
//让地平面能被投射阴影
ground.receiveShadows = true;
优化配置
速度优先
- 将shadowMaxZ设置得等于camera.maxZ
- 设置尽量小的cascadeBlendPercentage
- 设置autoCalcDepthBounds = true
- 设置freezeShadowCastersBoundingInfo = true
- 设置depthClamp = false
质量优先
- 将
camera.maxZ - camera.minZ的范围设置得越紧凑越好 - 将
camera.minZ设置得越大越好 - numCascades = 4
- map的size越大越好
- 设置
autoCalcDepthBounds = true - 设置
lambda = 1 - 设置
depthClamp = true - 设置
stabilizeCascades = false -
filteringQuality设置得越大越好