モデル形式の素材マッピング

ソース資産がモデルとして変換されると、コンバーターによってメッシュごとに素材が作成されます。 素材の作成方法は、オーバーライドできます。 しかし、既定では、変換によって PBR 素材が作成されます。 FBX のようなソース ファイル形式ではすべて、素材を定義するために独自の規則が使用されるため、それらの規則を Azure Remote Rendering の PBR 素材パラメーターにマップする必要があります。

この記事では、ソース資産の素材を実行時の素材に変換するために使用される正確なマッピングを一覧表示します。

glTF

glTF 2.0 仕様のほぼすべてのものは、EmissiveFactorEmissiveTexture を除き、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 拡張機能がサポートされます。

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.0721
  • DiffuseBrightness = 0.299 * Diffuse.Red2 + 0.587 * Diffuse.Green2 + 0.114 * Diffuse.Blue2
  • SpecularBrightness = 0.299 * Specular.Red2 + 0.587 * Specular.Green2 + 0.114 * Specular.Blue2
  • SpecularStrength = max(Specular.Red, Specular.Green, Specular.Blue)

SpecularIntensity 式は、ここから取得したものです。 明るさの式については、この仕様で説明されています。

ラフネス

Roughness は、この数式を使用して、SpecularShininessExponent から計算されます。 この数式は、Phong 反射指数からの粗さの近似値です。

Roughness = sqrt(2 / (ShininessExponent * SpecularIntensity + 2))

Metalness

Metalness は、この glTF 仕様の式を使用して、DiffuseSpecular から計算されます。

ここでの考え方は、次の式を解くことです: 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 は、DiffuseSpecular、および Metalness から計算されます。

「Metalness」セクションで説明したように、誘電体表面では約 4% の光を反射します。
ここでの考え方は、Metalness 値を因子として使用し、DielectricMetal の色の間を線形補間することです。 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 つの数式に統合することです。 一般的な方法で作成されていない場合でも、一部のアセットが誤って透明としてレンダリングされるようになります。

これは TransparentColorTransparencyFactorOpacity から計算されます。

Opacity が定義されている場合、AlbedoAlpha = Opacity を直接使用します。または、
TransparencyColor が定義されている場合は、AlbedoAlpha = 1.0 - ((TransparentColor.Red + TransparentColor.Green + TransparentColor.Blue) / 3.0)。あるいは、
TransparencyFactor の場合は、AlbedoAlpha = 1.0 - TransparencyFactor

最終的な Albedo の色のチャネルは 4 つとなり、AlbedoRGBAlbedoAlpha が組み合わされます。

まとめ

まとめると、Specular がゼロに近い場合、Albedo は元の Diffuse に非常に近くなります。 それ以外の場合、表面は金属表面のように見え、拡散色は失われます。 ShininessExponent が十分に大きく、Specular が明るい場合、表面はより滑らかに見え、反射性が増します。 それ以外の場合、表面は粗く見え、環境をほとんど反射しません。

既知の問題

  • 現在の数式は、シンプルな色付きジオメトリに対しては適切に機能しません。 Specular が十分明るい場合、すべてのジオメトリが色なしの反射する金属表面になります。 この場合の回避策は、Specular を元のものから 30% に下げるか、変換設定の fbxAssumeMetallic を使用することです。
  • Maya および 3DS Max のコンテンツ作成ツールには、最近、PBR 素材が追加されました。 ユーザー定義のカスタム ブラックボックス プロパティを使用して、FBX に渡されます。 Azure Remote Rendering ではこれらのプロパティが読み取られません。これらはドキュメント化されておらず、形式がクローズドソースであるためです。

次のステップ