# 燈光
燈光組件Light用于給場景提供照明,也是陰影的核心。相機組件一般被代理到燈光元素XRLight中使用,其派生自XRNode,對應(yīng)在xml中的標(biāo)簽為xr-light。
# 創(chuàng)建燈光
燈光元素的一個典型使用方式如下:
<xr-light type="ambient" color="1 1 1" intensity="0.1" />
<xr-light type="directional" rotation="40 170 0" color="1 1 1" intensity="0.2" />
<xr-light type="point" position="0 0 0" color="1 0 0" range="3" intensity="3" />
<xr-light type="spot" position="0.1 0 -0.1" color="0 0 1" range="12" intensity="10" rotation="0 120 0" inner-cone-angle="80" outer-cone-angle="90" />
這里寫了四個燈光,分別對應(yīng)于支持的四周燈光類型。框架針對一個場景共支持六個燈光,它們又被分成兩類——主光源和追加光源。
# 主光源
主光源包含兩部分——按照編寫順序第一個寫的環(huán)境光和平行光:
- 環(huán)境光:類型是
ambient,支持顏色color和亮度intensity,直接影響物體的基礎(chǔ)顏色和亮度。 - 平行光:類型是
directional,支持顏色color和亮度intensity,以及通過旋轉(zhuǎn)rotation決定的方向,為物體表面通過不同光照算法提供明暗。
主平行光同時還決定著這個場景的陰影計算,詳見陰影一節(jié)。
以上信息會在渲染時通過全局宏和uniforms傳入著色器,它們是:
| 類型 | uniforms | 宏 | 說明 |
|---|---|---|---|
| 環(huán)境光 | 顏色和亮度u_ambientLightColorIns | 是否開啟WX_USE_AMBIENT_LIGHT | [r, g, b, ins] |
| 平行光 | 顏色和亮度u_mainLightColorIns和方向u_mainLightDir | 是否開啟WX_USE_MAIN_DIR_LIGHT | [r, g, b, ins]/vec3 |
# 追加光源
在兩個主光源之后,場景還支持四個追加的光源,除了上面說到的平行光之外,還支持點光源和聚光燈:
- 點光源:支持顏色
color和亮度intensity,以及position決定的位置和range決定的照亮范圍。 - 聚光燈:支持顏色
color和亮度intensity,以及position決定的位置、rotation決定的方向、range決定的照亮范圍,和inner-cone-angle與outer-cone-angle決定的錐角。
以上信息會在渲染時通過全局宏和uniforms傳入著色器,它們是:
| 類型 | 宏 | 說明 |
|---|---|---|
| 開啟追加光源 | WX_USE_ADD_LIGHTS | bool |
| 燈光數(shù)量 | WX_ADD_LIGHTS_COUNT | int |
| 類型 | uniforms | 說明 |
|---|---|---|
| 燈光信息 | u_addLightsInfo | [type, range, innerConeAngle, outerConeAngle][4] |
| 燈光位置 | u_addLightsPos | vec3[4] |
| 燈光方向 | u_addLightsDir | vec3[4] |
| 燈光顏色亮度 | u_addLightsColorIns | [r, g, b, ins][4] |
# 陰影
在前面網(wǎng)格一章中我們提到過陰影,陰影是燈光和這二者的協(xié)作結(jié)果,只有主平行光能夠產(chǎn)生陰影,以如下場景為例:
<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來產(chǎn)生陰影,最后開啟了主光源的cast-shadow總開關(guān)允許燈光產(chǎn)生陰影。
當(dāng)然,在實際使用中會有一些需要關(guān)注的地方:
- 支持自己給自己投影,可以同時開啟產(chǎn)生和接收陰影。
- 可能需要視情況調(diào)整
shadow-distance來避免陰影投影過大或者過小。 - 適當(dāng)調(diào)整
shadow-bias來防止自陰影。
# 宏和uniforms
以下宏或者uniforms會被傳遞到著色器中:
| 類型 | 宏 | 說明 |
|---|---|---|
| 開啟接受陰影 | WX_RECEIVE_SHADOW | bool |
可以直接通過以下方法來獲取當(dāng)前物體陰影:
| 方法 | 說明 |
|---|---|
float shadowCalculation(vec3 posWorld) | 傳入世界坐標(biāo),返回陰影強度 |