モデル変換中に素材をオーバーライドする
ソース モデルの素材設定は、レンダラーに使用される PBR 素材を定義します。 場合によっては、既定の変換では目的の結果が得られず、変更を加える必要があります。 詳細については、「モデル形式の素材マッピング」を参照してください。
Azure Remote Rendering で使用するために三角形メッシュを変換する場合は、素材のオーバーライド ファイルを用意して、素材変換を行う方法を素材ごとにカスタマイズできます。 入力モデルが <modelName>.<ext> である入力コンテナー内に <modelName>.MaterialOverrides.json という名前のファイルが見つかった場合、それが素材オーバーライド ファイルとして使用されます。
変換中に使用されるオーバーライド ファイル
単純な例として、Default
という 1 つの素材があるボックス モデルについて見てみます。
その albedo の色は、Remote Rendering で使用するために調整する必要があります。
この場合、box.MaterialOverrides.json ファイルを次のように作成できます。
[
{
"name": "Default",
"albedoColor": {
"r": 0.33,
"g": 0.33,
"b": 0.33,
"a": 1.0
}
}
]
box.MaterialOverrides.json ファイルを box.fbx と共に入力コンテナーに配置することで、変換サービスに新しい設定を適用するように指示します。
色素材
色素材モデルは、照明に関係のない常に影の付いたサーフェスを表します。
色素材は、たとえば写真測量アルゴリズムによって作成された資産に役立ちます。 詳細については、「色素材」を参照してください。
素材のオーバーライド ファイルでは、unlit
を true
に設定することで、素材を色素材として宣言できます。
[
{
"name": "Photogrametry_mat1",
"unlit" : true
},
{
"name": "Photogrametry_mat2",
"unlit" : true
}
]
特定のテクスチャ マップを無視する
場合によっては、変換プロセスで特定のテクスチャ マップを無視することがあります。 このような状況は、レンダラーで認識できない特殊なマップを生成するツールによって、モデルが生成された場合に発生する可能性があります。 たとえば、不透明度以外の何かを定義するために "OpacityMap" が使用される場合や、"NormalMap" が "BumpMap" として格納される場合などです。 後者の場合は、"NormalMap" を無視します。これにより、コンバーターには "BumpMap" が "NormalMap" として使用されます。
ignoreTextureMaps
というプロパティを追加し、無視するテクスチャ マップを追加します。
[
{
"name": "Default",
"ignoreTextureMaps": ["OpacityMap", "NormalMap"]
}
]
無視できるテクスチャ マップの詳細な一覧については、「JSON スキーマ」を参照してください。
複数の素材に同じオーバーライドを適用する
既定では、素材のオーバーライド ファイルにあるエントリの名前が素材名と完全に一致した場合にそのエントリが適用されます。
同じオーバーライドを複数の素材に適用することがよくあるため、必要に応じて正規表現をエントリ名として指定できます。
フィールド nameMatching
の既定値は exact
ですが、regex
に設定することで、一致するすべての素材にそのエントリが適用されるようになります。
正規表現の構文は、JavaScript で使用する構文と同じです。
ヒント
任意の文字列に対して正規表現をテストおよびデバッグできる無料の正規表現テスト Web サイトがあります。
次の例に示すオーバーライドは、Material2
、Material01
、Material999
などの名前の素材に適用されます。
[
{
"name": "Material[0-9]+",
"nameMatching": "regex",
"albedoColor": {
"r": 0.0,
"g": 0.0,
"b": 1.0,
"a": 1.0
}
}
]
この例では、"すべての" 素材に適用されるオーバーライドを示します。
[
{
"name": ".*",
"nameMatching": "regex",
"albedoColor": {
"r": 0.0,
"g": 0.0,
"b": 1.0,
"a": 1.0
}
}
]
すべての素材が一致するオーバーライドを検出する順序は次のとおりです。
- まず、完全な名前の一致をテストします (つまり、
nameMatching
が存在しないかexact
と等しい場合は、すべてのオーバーライドがチェックされます)。 - オーバーライドが見つからない場合は、
regex
名前一致モードですべてのオーバーライドをテストし、一致する "最初の" オーバーライドを使用します。
素材名に複数の regex
式が適用されている場合でも、1 つの素材に複数のオーバーライドが適用されることはありません。
適用されたエントリに関する情報を取得する
出力コンテナーに書き込まれる info ファイルには、指定されたオーバーライドの数とオーバーライドされた素材の数に関する情報が記録されています。 詳細については、「変換されたモデルに関する情報」を参照してください。
JSON スキーマ
素材ファイルの完全な JSON スキーマを以下に示します。 unlit
と ignoreTextureMaps
を例外として、使用できるプロパティは、色素材モデルと PBR 素材モデルのセクションで説明されているプロパティの一部です。
{
"definitions" :
{
"color":
{
"type" : "object",
"description" : "Color as 4 components vector",
"properties":
{
"r": {"type":"number"},
"g": {"type":"number"},
"b": {"type":"number"},
"a": {"type":"number"}
},
"required": ["r", "g", "b"]
},
"alpha":
{
"type" : "object",
"description" : "Alpha channel for color",
"properties":
{
"a": {"type":"number"}
},
"required": ["a"]
},
"colorOrAlpha":
{
"anyOf": [
{"$ref": "#/definitions/color"},
{"$ref": "#/definitions/alpha"}
]
},
"listOfMaps":
{
"type": "array",
"items": {
"type": "string",
"enum": ["AlbedoMap",
"EmissiveMap",
"NormalMap",
"OcclusionMap",
"RoughnessMap",
"MetalnessMap",
"ReflectivityMap",
"BumpMap",
"OpacityMap",
"DiffuseMap",
"SpecularMap",
"ShininessMap",
"MetallicRoughnessMap",
"SpecularGlossinessMap"]
}
}
},
"type" : "array",
"description" : "List of materials to override",
"items":
{
"type" : "object",
"description" : "List of parameters to override",
"properties":
{
"name": { "type" : "string"},
"nameMatching" : { "type" : "string", "enum" : ["exact", "regex"] },
"unlit": { "type" : "boolean" },
"albedoColor": { "$ref": "#/definitions/colorOrAlpha" },
"roughness": { "type": "number" },
"metalness": { "type": "number" },
"normalMapScale": { "type": "number" },
"transparent": { "type" : "boolean" },
"alphaClipEnabled": { "type" : "boolean" },
"alphaClipThreshold": { "type": "number" },
"useVertexColor": { "type" : "boolean" },
"isDoubleSided": { "type" : "boolean" },
"ignoreTextureMaps": { "$ref" : "#/definitions/listOfMaps" },
"transparencyWritesDepth": {"type" : "boolean" }
},
"required": ["name"],
"additionalProperties" : false
}
}