# Standard 標(biāo)準(zhǔn)物理光照渲染
Standard 材質(zhì)基于標(biāo)準(zhǔn)的 PBR 進(jìn)行實(shí)現(xiàn)。
PBR(Physically Based Rendering) 是指使用基于物理原理和微平面理論建模的著色/光照模型,以及使用從現(xiàn)實(shí)中測量的表面參數(shù)來準(zhǔn)確表示真實(shí)世界材質(zhì)的渲染理念。

使用 PBR 的優(yōu)勢
- 基于物理模型與數(shù)學(xué)推演帶來的效果的
真實(shí)。 - 藝術(shù)導(dǎo)向性的、標(biāo)準(zhǔn)化的美術(shù)參數(shù)帶來的
易用與效果一致。
xr-frame 使用 PBR 有以下兩種方式
- 使用帶光照材質(zhì)的 glTF 資源,目前主流的各類
DCC工具(Digital Content Create) 都可以產(chǎn)出這種業(yè)界通用的格式。 - 使用內(nèi)置的
standard創(chuàng)建材質(zhì),并設(shè)置所需的不同uniform來進(jìn)行對應(yīng)渲染。
# 創(chuàng)建 standard 材質(zhì)進(jìn)行渲染
使用 standard 材質(zhì)進(jìn)行渲染時(shí),可以設(shè)置以下的 uniform 來決定渲染效果。
各系數(shù)的美術(shù)意義可以參考 創(chuàng)建PBR紋理實(shí)用指南。
# 基礎(chǔ)色 (baseColor)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_baseColorMap | texture | 顏色貼圖,顏色空間為 SRGB | 默認(rèn)未使用 |
| u_baseColorFactor | vec4 | 顏色因子,顏色空間為 SRGB | 1, 1, 1, 1 |
基礎(chǔ)色表示物體的 表面顏色,PBR 中可以認(rèn)為影響 電介質(zhì)(非金屬)漫反射 與 金屬反射率值。
vec4 baseColor = vec4(1.0, 1.0, 1.0, 1.0);
// 若設(shè)定基礎(chǔ)色貼圖
baseColor *= SRGBtoLINEAR(u_baseColorMap);
// 若設(shè)定基礎(chǔ)色因子,glTF情況下,傳入LINEAR空間顏色,不進(jìn)行顏色空間轉(zhuǎn)化
baseColor *= SRGBtoLINEAR(u_baseColorFactor);
// 若設(shè)定頂點(diǎn)色
baseColor *= vec4(v_Color, 1.0);
基礎(chǔ)色貼圖:左側(cè)為只有基礎(chǔ)色效果;右側(cè)為基礎(chǔ)色貼圖

# 金屬度粗糙度 (metallic rougness)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_metallicRoughnessMap | texture | 金屬粗糙度貼圖,g 部分為粗糙度,b 部分為金屬度 | 默認(rèn)未使用 |
| u_metallicMap | texture | 金屬度貼圖,未使用金屬粗糙度貼圖時(shí)才生效 | 默認(rèn)未使用 |
| u_roughnessMap | texture | 粗糙度度貼圖,未使用金屬粗糙度貼圖時(shí)才生效 | 默認(rèn)未使用 |
| u_metallicRoughnessValues | vec2 | 金屬粗糙度因子,第一位為金屬度,第二位為粗糙度 | 0, 1 |
| u_ior | float | 折射率,默認(rèn)值可以認(rèn)為類似塑料折射率 | 1.5 |
金屬度 表示 哪些區(qū)域是粗金屬(0=電介質(zhì),1=金屬),影響 電介質(zhì)模型 與 金屬模型 的 線性混合。
粗糙度 表示 表面粗糙度,控制 漫反射和鏡面反射。
IOR 表示 折射率,控制材質(zhì)的 F0,即0度角入射的菲涅爾反射值。
float metallic = u_metallicRoughnessValues.b; // 默認(rèn)值 0.0,glTF 為 1.0
float roughness = u_metallicRoughnessValues.g; // 默認(rèn)值 1.0
// 若設(shè)定金屬度粗糙度貼圖
metallic *= metallicRoughnessMap.b;
roughness *= metallicRoughnessMap.g;
// F0
f0 = min( pow2( ( u_ior - 1.0 ) / ( u_ior + 1.0 ) ) * specularColorFactor;
金屬度粗糙度:左上角為金屬度效果圖,左下角為粗糙度效果圖,數(shù)值0為黑色,數(shù)值1為白色;右側(cè)為金屬粗糙度貼圖,g 部分為粗糙度,b 部分為金屬度。

# 法線 (Normal)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_normalMap | texture | 法線貼圖 | 默認(rèn)未使用 |
| u_normalScale | float | 法線貼圖縮放,需使用法線貼圖才生效 | 1 |
法線 可以認(rèn)為是 垂直于頂點(diǎn)表面 的(單位)向量。于頂點(diǎn)數(shù)據(jù)中傳入,用于 PBR 中光照相關(guān)的各類運(yùn)算。
法線貼圖 可以理解為一種高度貼圖,用于模仿表面細(xì)節(jié)。貼圖中的每個(gè)像素,代表切線空間中,將法線處理為真實(shí)法線的偏差處理。
使用法線貼圖的情況下,需要傳入頂點(diǎn)Tangent才能生效。
float normal = vNormal;
// 如果使用法線貼圖,需要保證存在 vNormal 與 vTangent 以算出vTBN
mat3 vTBN = mat3( tangent, bitangent, normal );
normal = normalize( vTBN * normalMap );
法線:左側(cè)圖片為世界空間中法線效果,右側(cè)為法線貼圖。

# 自發(fā)光 (Emissive)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_emissiveMap | texture | 自發(fā)光貼圖,顏色空間為 SRGB | 默認(rèn)未使用 |
| u_emissiveFactor | vec3 | 自發(fā)光貼圖因子,顏色空間為 LINEAR | 0, 0, 0 |
自發(fā)光 表示了材質(zhì)作為光源向外發(fā)送的顏色信息,顏色空間為 SRGB。
vec4 emissiveColor = u_emissiveFactor;
// 若設(shè)定自發(fā)光貼圖
vec4 emissiveColor *= SRGBtoLINEAR(u_emissiveMap);
自發(fā)光:左側(cè)圖片為只有自發(fā)光的效果,右側(cè)圖片為自發(fā)光貼圖。

# 環(huán)境光遮蔽 (Ambient occlusion)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_occlusionMap | texture | 環(huán)境光遮蔽貼圖 | 默認(rèn)未使用 |
| u_occlusionStrength | float | 環(huán)境光遮蔽貼圖強(qiáng)度,需使用遮蔽貼圖才生效 | 1 |
環(huán)境光遮蔽 指表面某點(diǎn)能獲得多少環(huán)境中的光。該貼圖只影響漫反射分配,不影響高光反射分配。
// 若設(shè)定遮蔽貼圖
float ao = u_occlusionMap;
// 若設(shè)定遮蔽貼圖 與 遮蔽因子
ao *= u_occlusionStrength;
環(huán)境光遮蔽:左側(cè)圖片為默認(rèn)PBR渲染效果,右側(cè)圖片為環(huán)境光遮擋顯示效果,0為完全遮蔽,1為完全不遮蔽。

# 透明剔除 (alphaCutoff)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_alphaCutoff | float | 透明剔除閾值,當(dāng) baseColor 的 alpha 小于 u_alphaCutoff 時(shí),不進(jìn)行繪制,alphaMode 為 MASK 的情況下才生效 | 0.5 |
透明剔除 用于進(jìn)行透明度剔除。當(dāng)alphaMode 為 MASK 的情況下,會(huì)不渲染 baseColor 的 alpha 小于 u_alphaCutoff 的像素。
如需使用透明剔除,需手動(dòng)設(shè)置宏 WX_USE_ALPHA_CUTOFF或設(shè)置渲染狀態(tài)使用。
透明剔除:左側(cè)圖片為開啟alphaCutoff效果,右側(cè)圖片為未使用alphaCutoff效果。

# 清漆效果 (clearcoat)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_clearcoatFactor | float | 清漆強(qiáng)度 | 0 |
| u_clearcoatRoughnessFactor | float | 清漆粗糙度 | 0 |
清漆效果 可以認(rèn)為是往物體表面添加透明涂層。
如需使用清漆效果,需手動(dòng)設(shè)置宏 WX_USE_CLEARCOAT。
清漆強(qiáng)度:左側(cè)圖片為使用clearcoat效果,右側(cè)圖片為未使用clearcoat效果

# 高光反射與光澤度 (specularGlossiness)
| uniforms | 類型 | 備注 | 默認(rèn)值 |
|---|---|---|---|
| u_specularFactor | vec3 | 高光反射因子 | 1, 1, 1 |
| u_glossinessFactor | float | 光澤度 | 1.0 |
| u_specularGlossinessMap | texture | 高光光澤貼圖,其中rgb部分是高光反射,a部分為光澤度 | 默認(rèn)未使用 |
高光反射與光澤度 是 PBR 的另外一種渲染流程,相對于金屬度粗糙度流程,該流程可以在高光反射貼圖中控制F0。其中 光澤度 相當(dāng)于(1 - 粗糙度)。
漫反射部分 的 diffuse 因子與貼圖可以直接使用 基礎(chǔ)色 basecolor 相關(guān)參數(shù)。
如需使用高光反射與光澤度流程,需手動(dòng)設(shè)置宏 WX_USE_SPECULARGLOSSINESS。
高光反射與光澤度:左側(cè)為使用高光反射與光澤度流程模型的渲染效果;右上為diffuse貼圖(baseColorMap);右下為specularGlossiness貼圖,其中rgb部分為高光反射,a部分為光澤度。

# standard 參數(shù)定義
- 基礎(chǔ)色相關(guān) basecolor
- 金屬度粗糙度相關(guān) metallic rougness ior
- 法線相關(guān) normal
- 自發(fā)光相關(guān) emissive
- 環(huán)境光遮蔽相關(guān) ambient occlusion
- 透明剔除相關(guān) alphacutoff
- 清漆效果相關(guān) clearcoat
- 高光反射與光澤度相關(guān) specular glossiness
- 透射 transmission (TODO)
- 體積渲染 volume (TODO)
# standard 宏定義
| 宏 | 說明 | 類型 |
|---|---|---|
| WX_MANUAL_LINEAR_BASECOLORFACTOR | 基礎(chǔ)色因子是否使用 Linear空間 | bool |
| WX_USE_BASECOLORMAP | 是否使用基礎(chǔ)色貼圖,使用u_baseColorMap后會(huì)自動(dòng)設(shè)為true | bool |
| WX_USE_METALROUGHNESSMAP | 是否使用金屬粗糙度貼圖,使用u_metallicRoughnessMap后會(huì)自動(dòng)設(shè)為true | bool |
| WX_USE_EMISSIVEMAP | 是否使用自發(fā)光貼圖,使用u_emissiveMap后會(huì)自動(dòng)設(shè)為true | bool |
| WX_USE_OCCLUSIONMAP | 是否使用遮擋貼圖,使用u_occlusionMap后會(huì)自動(dòng)設(shè)為true | bool |
| WX_USE_COLOR_0 | 是否使用第一位頂點(diǎn)色 | bool |
| WX_USE_ALPHA_CUTOFF | 是否使用透明剔除 | bool |
| WX_USE_CLEARCOAT | 是否使用清漆效果 | bool |
| WX_USE_SPECULARGLOSSINESS | 是否使用高光反射與光澤度渲染流程 | bool |
| WX_USE_SPECULARGLOSSINESSMAP | 是否使用高光反射與光澤度渲染貼圖,使用u_specularGlossinessMap后會(huì)自動(dòng)設(shè)為true | bool |
# standard 默認(rèn)渲染狀態(tài)
"renderStates": {
cullOn: true,
blendOn: false,
depthWrite: true,
cullFace: Kanata.ECullMode.BACK
}
具體渲染狀態(tài)細(xì)節(jié)可以參考 材質(zhì)支持渲染狀態(tài)列表。
# 使用glTF渲染
參照 glTF 文檔使用。
# 使用Mesh渲染
<xr-assets>
<!-- 加載外部環(huán)境配置 -->
<xr-asset-load type="env-data" asset-id="env1" src="/assets/env-hdr/data.bin" />
<!-- 加載外部貼圖 -->
<xr-asset-load type="texture" asset-id="gold-albedo" src="/assets/material/gold/albedo.png" />
<xr-asset-load type="texture" asset-id="gold-metallic" src="/assets/material/gold/metallic.png" />
<xr-asset-load type="texture" asset-id="gold-roughness" src="/assets/material/gold/roughness.png" />
<xr-asset-load type="texture" asset-id="gold-ao" src="/assets/material/gold/ao.png" />
<!-- 加載standard材質(zhì) -->
<xr-asset-material asset-id="standard-mat" effect="standard" />
</xr-assets>
<!--
設(shè)置環(huán)境數(shù)據(jù),配置對應(yīng)的IBL(漫反射與鏡面反射)
使用外部配置
env1
使用內(nèi)置配置
xr-frame-team-workspace-day
xr-frame-team-workspace-day2
xr-frame-team-workspace-night
-->
<xr-env env-data="env1"/>
<!--
添加 圓體
使用 standard-mat 材質(zhì)
設(shè)置 金屬度因子為1,粗糙度因子為1
設(shè)置 不同類型的貼圖
設(shè)置 渲染狀態(tài) cullOn 為 false
...
-->
<xr-mesh
node-id="mesh-sphere" geometry="sphere"
material="standard-mat"
uniforms="
u_metallicRoughnessValues: 1 1,
u_baseColorMap: gold-albedo,
u_metallicMap: gold-metallic,
u_roughnessMap: gold-roughness
"
states="cullOn: false"
></xr-mesh>
glTF Resource from SketchFab by @re1monsen @theblueturtle_ @Bastien Genbrugge @Willy Decarpentrie @Martin Trafas