模型格式的資料對應
當來源資產 轉換成模型 時,轉換器會 為每個 網格 建立材質 。 建立材質的方式可以 覆 寫。 不過,根據預設,轉換將會建立 PBR 材質 。 由於每個來源檔案格式,例如 FBX,都會使用自己的慣例來定義資料,因此這些慣例必須對應至 Azure 遠端轉譯 的 PBR 材質參數。
本文列出用來將材質從來源資產轉換為執行時間材質的確切對應。
glTF
除了 EmissiveFactor 和 EmissiveTexture 之外, Azure 遠端轉譯支援 glTF 2.0 規格中的所有專案。
下表顯示對應:
glTF | Azure 遠端轉譯 |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | 金屬性 |
metallicTexture | metalnessMap |
roughnessFactor | 粗糙 度 |
roughnessTexture | 粗糙度Map |
occlusionFactor | 閉塞 |
occlusionTexture | occlusionMap |
normalTexture | normalMap |
normalTextureInfo.scale | normalMapScale |
AlphaCutoff | AlphaClipThreshold |
AlphaMode.OPAQUE | AlphaClipEnabled = false,isTransparent = false |
AlphaMode.MASK | AlphaClipEnabled = true,isTransparent = false |
AlphaMode.BLEND | isTransparent = true |
doubleSided | isDoubleSided |
emissiveFactor | - |
emissiveTexture | - |
glTF 中的每個紋理都可以有一個 texCoord
值,Azure 遠端轉譯材質也支援此值。
內嵌紋理
支援內嵌在 *.bin 或 *.glb 檔案中的 紋理。
支援的 glTF 擴充功能
除了基底功能集外,Azure 遠端轉譯還支援下列 glTF 擴充功能:
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit:對應至 色彩材質 。 對於 Emissive 材料,建議使用此延伸模組。
- KHR_materials_pbrSpecularGlossiness:您可以提供擴散反射光澤紋理,而不是金屬粗糙度紋理。 Azure 遠端轉譯實作會直接遵循延伸模組的轉換公式。
FBX
FBX 格式是封閉式來源,FBX 材質通常與 PBR 材質不相容。 FBX 使用具有許多唯一參數和屬性 之介面的複雜描述,而不是 Azure 遠端轉譯 管線 會使用這些介面。
重要
Azure 遠端轉譯模型轉換管線僅支援 FBX 2011 和更新版本 。
FBX 格式會定義材料保守的方法,官方 FBX 規格中只有兩種類型:
- Lambert - 在轉換時,通常尚未使用相當長的時間,但在轉換時仍支援轉換成 Phong。
- Phong - 幾乎所有的材料和大部分的內容工具都使用此類型。
Phong 模型更精確,它用作 FBX 材質的唯 一 模型。 以下稱為 FBX 材質 。
Maya 會定義材質 PBR 和 Stingray 類型的自訂屬性,以針對 FBX 使用兩個自訂延伸模組。 這些詳細資料不會包含在 FBX 規格中,因此 Azure 遠端轉譯目前不支援此詳細資料。
FBX 材質使用 Diffuse-Specular-SpecularLevel 概念,因此若要從擴散紋理轉換成 albedo 地圖,我們需要計算其他參數以從擴散減去它們。
FBX 中的所有色彩和紋理都位於 sRGB 空間中(也稱為 Gamma 空間),但 Azure 遠端轉譯在視覺效果期間使用線性空間,而且框架結尾會將所有專案轉換成 sRGB 空間。 Azure 遠端轉譯資產管線會將所有專案轉換成線性空間,以將備妥的資料傳送給轉譯器。
下表顯示紋理如何從 FBX 材質對應至 Azure 遠端轉譯材質。 其中有些不是直接使用,而是與其他參與公式的紋理結合在一起(例如擴散紋理):
FBX | Azure 遠端轉譯 |
---|---|
AmbientColor | 遮蔽圖 |
DiffuseColor | 用於 Albedo、金屬 |
TransparentColor | 用於 Albedo 的 Alpha 色板 |
TransparencyFactor | 用於 Albedo 的 Alpha 色板 |
不透明度 | 用於 Albedo 的 Alpha 色板 |
SpecularColor | 用於 Albedo、金屬性、粗糙度 |
SpecularFactor | 用於 Albedo、金屬性、粗糙度 |
ShininessExponent | 用於 Albedo、金屬性、粗糙度 |
NormalMap | NormalMap |
撞 | 已轉換為 NormalMap |
EmissiveColor | - |
EmissiveFactor | - |
反思ionColor | - |
DisplacementColor | - |
上述對應是材料轉換中最複雜的部分,因為必須進行許多假設。 我們會在下面討論這些假設。
以下使用的一些定義:
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
.紅色∗ 0.2125 +Specular
。綠色∗ 0.7154 +Specular
。Blue ∗ 0.0721DiffuseBrightness
= 0.299 *Diffuse
。紅色 2 + 0.587 *Diffuse
。綠色 2 + 0.114 *Diffuse
。藍色 2SpecularBrightness
= 0.299 *Specular
。紅色 2 + 0.587 *Specular
。綠色 2 + 0.114 *Specular
。藍色 2SpecularStrength
= max(Specular
.紅色,Specular
。綠色、Specular
。藍色)
SpecularIntensity 公式從這裡 取得。 此規格 會 說明亮度公式。
粗糙 度
Roughness
是從 和 ShininessExponent
使用此 公式 來計算 Specular
。 公式是 Phong 反射指數的粗糙度近似值:
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
金屬性
Metalness
是從 glTF 規格使用這個 公式來計算。 Diffuse
Specular
這裡的想法是,我們解決方程式:Ax 2 + Bx + C = 0。 基本上,表面以反射方式反射約4%的光線,其餘部分則是擴散。 金屬表面以擴散方式沒有光線反射,但全部以反射方式反射。 此公式有一些缺點,因為無法區分光澤塑膠和光澤金屬表面。 我們假設表面大部分時間都有金屬特性,因此光澤的塑膠/橡膠表面看起來可能不如預期。
dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength
A = dielectricSpecularReflectance
B = (DiffuseBrightness * (oneMinusSpecularStrength / (1 - A)) + SpecularBrightness) - 2 * A
C = A - SpecularBrightness
squareRoot = sqrt(max(0.0, B * B - 4 * A * C))
value = (-B + squareRoot) / (2 * A)
Metalness = clamp(value, 0.0, 1.0);
反照 率
Albedo
是從 Diffuse
、 Specular
和 Metalness
計算而來。
如金屬性一節所述,表面會反射約 4% 的光線。
這裡的想法是使用 Metalness
值作為因素,以線性方式插 Dielectric
補和 Metal
色彩。 如果金屬性為 0.0
,則視反射而定,它可能是深色(如果反射很高),或者擴散不會改變(如果沒有反射存在)。 如果金屬是較大的值,則擴散色彩會消失,以偏向反射色彩。
dielectricSpecularReflectance = 0.04
oneMinusSpecularStrength = 1 - SpecularStrength
dielectricColor = diffuseColor * (oneMinusSpecularStrength / (1.0f - dielectricSpecularReflectance) / max(1e-4, 1.0 - metalness))
metalColor = (Specular - dielectricSpecularReflectance * (1.0 - metalness)) * (1.0 / max(1e-4, metalness))
albedoRawColor = lerpColors(dielectricColor, metalColor, metalness * metalness)
AlbedoRGB = clamp(albedoRawColor, 0.0, 1.0);
AlbedoRGB
已由上述公式計算,但 Alpha 色板需要更多計算。 FBX 格式對透明度含糊不清,而且有許多定義方式。 不同的內容工具使用不同的方法。 這裡的想法是將它們統一成一個公式。 不過,如果某些資產不是以一般方式建立,則會讓某些資產不正確地轉譯為透明。
這是從 TransparentColor
、 TransparencyFactor
Opacity
、 計算:
如果 Opacity
已定義,則直接使用它: AlbedoAlpha
= Opacity
如果 TransparencyColor
已定義,則 AlbedoAlpha
= 1.0 - (( TransparentColor.Blue
TransparentColor.Red
+ TransparentColor.Green
+ ) / 3.0) else
如果 TransparencyFactor
為 ,則 AlbedoAlpha
= 1.0 - TransparencyFactor
最終 Albedo
色彩有四個色板,結合 AlbedoRGB
。 AlbedoAlpha
摘要
為了總結這裡,如果 接近零, Albedo
將會非常接近原始 Diffuse
Specular
。 否則,表面看起來會像金屬表面,並失去擴散色彩。 如果 ShininessExponent
足夠大且明亮,表面看起來會更加拋光和 Specular
反射。 否則,表面看起來會很粗糙,而且幾乎沒有反映環境。
已知問題
- 目前公式不適用於簡單的彩色幾何。 如果
Specular
足夠明亮,則所有幾何都會變成反射金屬表面,沒有任何顏色。 在此情況下,因應措施是從原始版本降低Specular
到 30%,或使用轉換設定 fbxAssumeMetallic 。 - PBR 資料最近已新增至
Maya
內容3DS Max
建立工具。 他們會使用自訂使用者定義黑箱屬性將它傳遞至 FBX。 Azure 遠端轉譯不會讀取這些屬性,因為它們並未記載,而且格式為封閉式來源。