在前面网格一章中我们提到过阴影,阴影是灯光和这二者的协作结果,只有主平行光能够产生阴影,以如下场景为例:
<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-gltf的cast-shadow来产生阴影,最后开启了主光源的cast-shadow总开关允许灯光产生阴影。
当然,在实际使用中会有一些需要关注的地方:
- 支持自己给自己投影,可以同时开启产生和接收阴影。
- 可能需要视情况调整
shadow-distance来避免阴影投影过大或者过小。 - 适当调整
shadow-bias来防止自阴影。
宏和uniforms
以下宏或者uniforms会被传递到着色器中:
| 类型 | 宏 | 说明 |
|---|---|---|
| 开启接受阴影 | WX_RECEIVE_SHADOW | bool |
可以直接通过以下方法来获取当前物体阴影:
| 方法 | 说明 |
|---|---|
float shadowCalculation(vec3 posWorld) | 传入世界坐标,返回阴影强度 |