# 材質(zhì)
材質(zhì) Material 基于 效果 Effect,提供了修改渲染狀態(tài)、Uniforms的接口,真正決定了物體最后的渲染方式,體現(xiàn)為物體表面的外觀。
# 創(chuàng)建一個材質(zhì)
創(chuàng)建材質(zhì)有兩種方式,一般我們會優(yōu)先在wxml中進行創(chuàng)建。
# 在wxml中創(chuàng)建
在xml中創(chuàng)建需要用到xr-asset-material標簽:
<xr-asset-material asset-id="mat" effect="standard" uniforms:"u_baseColorMap: waifu" states="alphaMode:BLEND" renderQueue="2500" />
其中asset-id是會添加到資源系統(tǒng)中的id,effect是已經(jīng)注冊過的效果,這兩個參數(shù)是必填的。uniforms類型是dict,用于覆蓋效果中定義的那些屬性,會根據(jù)那些屬性的type來進行解析,比如Vector2對應1 1這樣的數(shù)組;states類型也是dict,用于覆蓋效果中定義的那些渲染狀態(tài)(需要效果中開啟useMaterialStates);最后的renderQueue用于覆蓋效果中的默認渲染順序,大于等于2500為透明物體。
# 用代碼創(chuàng)建
有時候我們需要用代碼創(chuàng)建材質(zhì),也很簡單:
// 第一個參數(shù)是效果實例的引用,第二個參數(shù)是默認`uniforms`
const mat = scene.createMaterial(
// 使用內(nèi)置的 Standard 效果
scene.assets.getAsset('effect', 'standard'),
{u_baseColorMap: scene.assets.getAsset('texture', 'waifu')}
);
// 可以將其添加到資源系統(tǒng)中備用
scene.assets.addAsset('material', 'test-mat', mat);
創(chuàng)建完,接下來就是使用了。
# 使用材質(zhì)
材質(zhì)和其他資源一樣,可以通過在組件schema中設定數(shù)據(jù)類型為material,然后在xml中通過資源id索引,或者用setData直接使用。目前使用了材質(zhì)的組件只有網(wǎng)格,詳見對應章節(jié)。
除了被引用外,材質(zhì)也提供了一些方法來對其進行修改:
// 一系列修改Uniforms的接口
material.setFloat(key, value);
material.setVector(key, vec);
material.setMaterial(key, mat);
material.setTexture(key, texture);
// 修改渲染狀態(tài)
material.setRenderState(key, value);
// 修改宏
material.setMacros({key: value});
// 重置圖片,同時關(guān)閉對應的宏
material.resetTexture(key);
// 重置狀態(tài)
materia.clearRenderState(key);
# 材質(zhì)支持渲染狀態(tài)列表
| 狀態(tài)名稱 | 說明 | 類型 |
|---|---|---|
| renderQueue | 渲染順序 | number |
| cullOn | 是否開啟剔除 | bool |
| depthTestOn | 是否開啟深度測試 | bool |
| depthTestWrite | 是否開啟深度寫入 | bool |
| alphaMode | 透明模式 | 'OPAQUE' 'BLEND' 'MASK' |
| alphaCutOff | 是否開啟透明剔除 | bool |
| depthTestComp | 深度測試方法 | number, ECompareFunc對應的值 |
| stencilTestOn | 是否開啟模板測試 | boolean |
| stencilComp | 模板測試相關(guān) | number, ECompareFunc對應的值 |
| stencilRef | 模板測試相關(guān) | number |
| stencilReadMask | 模板測試相關(guān) | number |
| stencilWriteMask | 模板測試相關(guān) | number |
| stencilPass | 模板測試相關(guān) | number, EStencilOp對應的值 |
| stencilFail | 模板測試相關(guān) | number, EStencilOp對應的值 |
| stencilZFail | 模板測試相關(guān) | number, EStencilOp對應的值 |
| colorWrite | 顏色通道寫入掩碼,基礎庫v2.31.1開始支持 | number, 一個4bits的mask,由高到低為ABGR四個通道,比如0b1001表示只開啟R和A通道寫入 |