# 環(huán)境
環(huán)境Env是一種特殊的組件,其一般被代理到元素XREnv上使用。環(huán)境用于描述當(dāng)前場(chǎng)景的環(huán)境貼圖和光照信息,其一般和相機(jī)與材質(zhì)協(xié)作,實(shí)現(xiàn)豐富真實(shí)的渲染效果。
環(huán)境數(shù)據(jù)可以使用xr-frame-toolkit來生成。
# 創(chuàng)建環(huán)境組件
環(huán)境組件一般由xml創(chuàng)建,不建議使用代碼創(chuàng)建:
<xr-env env-data="env1" sky-map="video-vt" is-sky2d="false" rotation="30" diffuse-exp="1" specular-exp="1" />
以上幾個(gè)參數(shù)中,env-data指定的是環(huán)境數(shù)據(jù)資源,下面會(huì)說到;sky-map和is-sky-2d均和天空盒相關(guān),后面會(huì)說道;剩下這幾個(gè)均和環(huán)境數(shù)據(jù)相關(guān),統(tǒng)一在那個(gè)章節(jié)說道。
多個(gè)環(huán)境組件,后面的會(huì)覆蓋前面的。
# 環(huán)境數(shù)據(jù)
環(huán)境數(shù)據(jù)EnvData是一種資源,對(duì)其加載使用標(biāo)準(zhǔn)的加載流程:
<xr-asset-load type="env-data" asset-id="env1" src="/assets/env1.json" />
<xr-asset-load type="env-data" asset-id="env1-bin" src="/assets/env1.bin" />
可見其是一個(gè)json文件或者一個(gè)二進(jìn)制bin文件,其實(shí)它們都是一樣的,只不過出于優(yōu)化考慮,我們提供了將所有一個(gè)環(huán)境數(shù)據(jù)以來的所有資源大包圍單二進(jìn)制文件的形式。
環(huán)境數(shù)據(jù)一般由xr-frame-toolkit生成,詳見環(huán)境數(shù)據(jù)生成,這里只描述一下它的數(shù)據(jù)構(gòu)成,讓我們來看看一個(gè)典型的環(huán)境數(shù)據(jù)資源的內(nèi)容:
{
"skybox": {
"type": "2D",
"map": "skybox.jpg"
},
"specular": {
"type": "2D",
"rgbd": true,
"mipmaps": true,
"mipmapCount": 8,
"map": "specular.png"
},
"diffuse": {
"coefficients": [
[0.8094857154560582, 1.072061074418383, 1.381670726058194],
[0.4531993330022066, 0.6206639008366144, 0.8139572443587766],
[-0.004551401381201801, -0.0042687508887899826, -0.0036411318023787],
[-0.020985594814968922, -0.01687724945396023, -0.021128338350731538],
[0.1256484901729441, 0.18119453030438287, 0.24183004841815578],
[-0.0023734980925293335, -0.005654419816258108, -0.008260709190512553],
[0.032220320622268775, 0.01634986420924315, -0.002981050574747357],
[-0.010824356719832657, -0.004307541280643478, 0.003995962041610451],
[-0.019970535027080884, -0.025649669665237452, -0.03417036444009303]
]
}
}
可見其主要指定了三個(gè)部分:
skybox:天空盒部分,主要是一張?zhí)炜蘸屑y理,目前全部為2D全景紋理。specualr:高光反射部分,通過一張1:1的烘焙好的、包括所有mipmaps的高光貼圖實(shí)現(xiàn),目前全部采用rgbd編碼來控制體積。diffuse:漫反射部分,通過球諧系數(shù)SH9實(shí)現(xiàn)。
# 天空盒
在相機(jī)的章節(jié)里我們提到過天空盒,當(dāng)camera.background設(shè)置為skybox,將使用環(huán)境組件所定義的天空盒紋理,其由兩個(gè)屬性定義:
sky-map:天空盒紋理,默認(rèn)由環(huán)境數(shù)據(jù)提供,但也可以接受用戶使用此屬性覆蓋??梢允褂萌魏渭y理,包括視頻紋理。is-sky2d:天空盒渲染模式是否為2D,開啟時(shí)會(huì)渲染一個(gè)平鋪?zhàn)赃m應(yīng)的2D背景,此時(shí)紋理應(yīng)當(dāng)是一張2D圖。
# uniforms和宏
和渲染相關(guān)的環(huán)境數(shù)據(jù)均已全局uniform和全局宏的方式傳入著色器,它們是:
| 類型 | 宏 | 說明 |
|---|---|---|
| 開啟環(huán)境漫反射 | WX_USE_IBL_DIFFUSE | bool |
| 開啟環(huán)境高光反射 | WX_USE_IBL_SPECULAR | bool |
| 高光反射mipmaps數(shù)量 | WX_USE_SPECULAR_MIPMAPS | int |
| 高光反射使用RGBD | WX_USE_SPECULAR_RGBD | bool |
| 類型 | uniforms | 說明 |
|---|---|---|
| 漫反射系數(shù) | u_diffuseSH | vec3[9] |
| 漫反射曝光值 | u_diffuseExp | texture2d |
| 高光反射紋理 | u_specularEnvMap | texture2d |
| 高光反射曝光值 | u_specularExp | v |
| 環(huán)境和天空盒旋轉(zhuǎn) | u_envRotation | float |