babylonjs 阴影

783 阅读2分钟

阴影生成器

创建阴影

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 设置得越大越好