阴影

在前面网格一章中我们提到过阴影,阴影是灯光和这二者的协作结果,只有主平行光能够产生阴影,以如下场景为例:

<xr-mesh node-id="plane" position="0 -0.4 0" scale="5 0.2 5" geometry="cube"  uniforms="u_baseColorFactor:0.48 0.78 0.64 1" receive-shadow
/>
<xr-gltf model="test-gltf" cast-shadow/>
<xr-camera
  position="3 3 3" target="plane" 
/>
<xr-light type="directional" rotation="60 0 0" color="1 1 1" intensity="2.5" cast-shadow />

可见,我们给plane这个xr-mesh开启了receive-shadow去接收阴影,然后开启了xr-gltfcast-shadow来产生阴影,最后开启了主光源的cast-shadow总开关允许灯光产生阴影。

当然,在实际使用中会有一些需要关注的地方:

  1. 支持自己给自己投影,可以同时开启产生和接收阴影。
  2. 可能需要视情况调整shadow-distance来避免阴影投影过大或者过小。
  3. 适当调整shadow-bias来防止自阴影。

宏和uniforms

以下宏或者uniforms会被传递到着色器中:

类型 说明
开启接受阴影 WX_RECEIVE_SHADOW bool

可以直接通过以下方法来获取当前物体阴影:

方法 说明
float shadowCalculation(vec3 posWorld) 传入世界坐标,返回阴影强度