モデル形式の素材マッピング
ソース資産がモデルとして変換されると、コンバーターによってメッシュごとに素材が作成されます。 素材の作成方法は、オーバーライドできます。 しかし、既定では、変換によって PBR 素材が作成されます。 FBX のようなソース ファイル形式ではすべて、素材を定義するために独自の規則が使用されるため、それらの規則を Azure Remote Rendering の PBR 素材パラメーターにマップする必要があります。
この記事では、ソース資産の素材を実行時の素材に変換するために使用される正確なマッピングを一覧表示します。
glTF
glTF 2.0 仕様のほぼすべてのものは、EmissiveFactor と EmissiveTexture を除き、Azure Remote Rendering でサポートされています。
そのマッピングを次の表に示します。
glTF | Azure Remote Rendering |
---|---|
baseColorFactor | albedoColor |
baseColorTexture | albedoMap |
metallicFactor | metalness |
metallicTexture | metalnessMap |
roughnessFactor | roughness |
roughnessTexture | roughnessMap |
occlusionFactor | occlusion |
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 Remote Rendering の素材でもサポートされます。
埋め込みテクスチャ
*.bin または *.glb ファイルに埋め込まれているテクスチャがサポートされます。
サポートされている glTF の拡張機能
基本機能セットに加え、Azure Remote Rendering では次の glTF 拡張機能がサポートされます。
- MSFT_packing_occlusionRoughnessMetallic
- KHR_materials_unlit: 色素材に対応します。 "発色" 素材の場合は、この拡張機能を使用することをお勧めします。
- KHR_materials_pbrSpecularGlossiness: metallic-roughness テクスチャの代わりに、diffuse-specular-glossiness テクスチャを用意できます。 Azure Remote Rendering 実装では、拡張機能からの変換式に直接従います。
FBX
FBX 形式はクローズドソースであり、FBX 素材は一般に PBR 素材と互換性がありません。 FBX では、一意のパラメーターとプロパティを多く用いた表面の複雑な説明が使用されます。Azure Remote Rendering パイプラインでは、これらのすべてが使用されるわけではありません。
重要
Azure Remote Rendering モデル変換パイプラインでサポートされるのは、FBX 2011 以降のみです。
FBX 形式では、素材の保守的なアプローチが定義されます。公式の FBX 仕様には次の 2 種類しかありません。
- Lambert - 既にかなり長い間一般的に使用されていませんが、変換時に Phong に変換することでまだサポートされています。
- Phong - ほとんどすべての素材とほとんどのコンテンツ ツールで、この種類が使用されます。
この Phong モデルの方が正確であり、FBX 素材の "唯一" のモデルとして使用されます。 以下、"FBX 素材" と呼びます。
Maya では、PBR および Stingray という種類の素材に対してカスタム プロパティを定義することで、FBX で 2 つのカスタム拡張機能が使用されます。 これらの詳細は FBX 仕様には含まれていないため、現在、Azure Remote Rendering ではサポートされていません。
FBX 素材では Diffuse-Specular-SpecularLevel 概念が使用されます。したがって、拡散テクスチャから albedo マップに変換するには、拡散から減算するために他のパラメーターを計算する必要があります。
FBX のすべての色とテクスチャは、sRGB 空間 (ガンマ空間ともいう) にありますが、Azure Remote Rendering は視覚化時に線形空間で動作し、フレームの最後にすべてのものが sRGB 空間に戻されます。 Azure Remote Rendering 資産パイプラインでは、すべてを線形空間に変換し、準備されたデータとしてレンダラーに送信します。
次の表には、テクスチャが FBX 素材から Azure Remote Rendering 素材にどのようにマップされるかが示されています。 これらの一部は直接使用されませんが、式に関与する他のテクスチャ (拡散テクスチャなど) と組み合わせて使用されます。
FBX | Azure Remote Rendering |
---|---|
AmbientColor | オクルージョン マップ |
DiffuseColor | Albedo、Metalness に使用 |
TransparentColor | Albedo のアルファ チャネルに使用 |
TransparencyFactor | Albedo のアルファ チャネルに使用 |
不透明度 | Albedo のアルファ チャネルに使用 |
SpecularColor | Albedo、Metalness、Roughness に使用 |
SpecularFactor | Albedo、Metalness、Roughness に使用 |
ShininessExponent | Albedo、Metalness、Roughness に使用 |
NormalMap | NormalMap |
Bump | NormalMap に変換 |
EmissiveColor | - |
EmissiveFactor | - |
ReflectionColor | - |
DisplacementColor | - |
上記のマッピングは、多くの想定が必要であるため、素材変換の最も複雑な部分です。 以下では、これらの想定について説明します。
以下のいくつかの定義が使用されます。
Specular
=SpecularColor
*SpecularFactor
SpecularIntensity
=Specular
.Red ∗ 0.2125 +Specular
.Green ∗ 0.7154 +Specular
.Blue ∗ 0.0721DiffuseBrightness
= 0.299 *Diffuse
.Red2 + 0.587 *Diffuse
.Green2 + 0.114 *Diffuse
.Blue2SpecularBrightness
= 0.299 *Specular
.Red2 + 0.587 *Specular
.Green2 + 0.114 *Specular
.Blue2SpecularStrength
= max(Specular
.Red,Specular
.Green,Specular
.Blue)
SpecularIntensity 式は、ここから取得したものです。 明るさの式については、この仕様で説明されています。
ラフネス
Roughness
は、この数式を使用して、Specular
と ShininessExponent
から計算されます。 この数式は、Phong 反射指数からの粗さの近似値です。
Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))
Metalness
Metalness
は、この glTF 仕様の式を使用して、Diffuse
と Specular
から計算されます。
ここでの考え方は、次の式を解くことです: Ax2 + 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
Albedo
は、Diffuse
、Specular
、および Metalness
から計算されます。
「Metalness」セクションで説明したように、誘電体表面では約 4% の光を反射します。
ここでの考え方は、Metalness
値を因子として使用し、Dielectric
と Metal
の色の間を線形補間することです。 metalness が 0.0
の場合、反射に応じて、濃い色になるか (反射が高い場合)、拡散が変化しません (反射がない場合)。 metalness が大きな値の場合、反射色が優先されるため、拡散色は消えます。
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
は、上記の数式で計算されていますが、アルファ チャネルにはさらに計算が必要です。 FBX 形式は透明度についてはあいまいであり、多くの定義方法があります。 コンテンツ ツールによって、使用する方法が異なります。 ここでの考え方は、1 つの数式に統合することです。 一般的な方法で作成されていない場合でも、一部のアセットが誤って透明としてレンダリングされるようになります。
これは TransparentColor
、TransparencyFactor
、Opacity
から計算されます。
Opacity
が定義されている場合、AlbedoAlpha
= Opacity
を直接使用します。または、
TransparencyColor
が定義されている場合は、AlbedoAlpha
= 1.0 - ((TransparentColor.Red
+ TransparentColor.Green
+ TransparentColor.Blue
) / 3.0)。あるいは、
TransparencyFactor
の場合は、AlbedoAlpha
= 1.0 - TransparencyFactor
最終的な Albedo
の色のチャネルは 4 つとなり、AlbedoRGB
と AlbedoAlpha
が組み合わされます。
まとめ
まとめると、Specular
がゼロに近い場合、Albedo
は元の Diffuse
に非常に近くなります。 それ以外の場合、表面は金属表面のように見え、拡散色は失われます。 ShininessExponent
が十分に大きく、Specular
が明るい場合、表面はより滑らかに見え、反射性が増します。 それ以外の場合、表面は粗く見え、環境をほとんど反射しません。
既知の問題
- 現在の数式は、シンプルな色付きジオメトリに対しては適切に機能しません。
Specular
が十分明るい場合、すべてのジオメトリが色なしの反射する金属表面になります。 この場合の回避策は、Specular
を元のものから 30% に下げるか、変換設定の fbxAssumeMetallic を使用することです。 Maya
および3DS Max
のコンテンツ作成ツールには、最近、PBR 素材が追加されました。 ユーザー定義のカスタム ブラックボックス プロパティを使用して、FBX に渡されます。 Azure Remote Rendering ではこれらのプロパティが読み取られません。これらはドキュメント化されておらず、形式がクローズドソースであるためです。