設定模型轉換參數

在本文中,瞭解如何設定模型轉換的參數。

設定檔案

如果稱為 < modelName > 的檔案。轉換設定.json 位於輸入模型 modelName >< 旁邊的輸入容器中。 <ext > ,然後使用 檔案來提供模型轉換程式的額外組態。 例如,當您轉換 box.gltf 時,您會使用 box。轉換設定.json 以設定模型轉換的參數。

JSON 轉換設定檔的內容應該具有下列架構:

{
    "$schema" : "http://json-schema.org/schema#",
    "description" : "ARR ConversionSettings Schema",
    "type" : "object",
    "definitions" : 
    {
        "position_attribute" : {"type" : "string", "description" : "Destination format of the position attribute", "enum" : [ "32_32_32_FLOAT", "16_16_16_16_FLOAT" ]},
        "color_attribute" : {"type" : "string", "description" : "Destination format of the color attribute", "enum" : [ "NONE", "8_8_8_8_UNSIGNED_NORMALIZED" ]},
        "vector_attribute" : {"type" : "string", "description" : "Destination format of the normals, tangents and binormals attributes", "enum" : [ "NONE", "8_8_8_8_SIGNED_NORMALIZED", "16_16_16_16_FLOAT" ]},
        "texcoord_attribute" : {"type" : "string", "description" : "Destination format of the texture coordinates attribute", "enum" : [ "NONE", "32_32_FLOAT", "16_16_FLOAT" ]}
    },
    "properties" : 
    {
        "scaling" : { "type" : "number", "exclusiveMinimum" : 0, "default" : 1.0 },
        "recenterToOrigin" : { "type" : "boolean", "default" : false },
        "opaqueMaterialDefaultSidedness" : {" type" : "string", "enum" : [ "SingleSided", "DoubleSided" ], "default" : "DoubleSided" },
        "material-override" : { "type" : "string", "default" : "" },
        "gammaToLinearMaterial" : { "type" : "boolean", "default" : false },
        "gammaToLinearVertex" : { "type" : "boolean", "default" : false },
        "sceneGraphMode" : { "type" : "string", "enum" : [ "none", "static", "dynamic" ], "default" : "dynamic" },
        "generateCollisionMesh" : { "type" : "boolean", "default" : true },
        "unlitMaterials" : { "type" : "boolean", "default" : false },
        "deduplicateMaterials" : {"type" : "boolean", "default" : true },
        "fbxAssumeMetallic" : {"type" : "boolean", "default" : true },
        "axis" : {
            "type" : "array",
            "items" : {
                "type" : "string",
                "enum" : [ "default", "+x", "-x", "+y", "-y", "+z", "-z" ]
            },
            "minItems" : 3,
            "maxItems" : 3
        },
        "vertex" : {
            "type" : "object",
            "properties" : {
                "position" : { "$ref" : "#/definitions/position_attribute" },
                "color0" : { "$ref" : "#/definitions/color_attribute" },
                "color1" : { "$ref" : "#/definitions/color_attribute" },
                "normal" : { "$ref" : "#/definitions/vector_attribute" },
                "tangent" : { "$ref" : "#/definitions/vector_attribute" },
                "binormal" : { "$ref" : "#/definitions/vector_attribute" },
                "texcoord0" : { "$ref" : "#/definitions/texcoord_attribute" },
                "texcoord1" : { "$ref" : "#/definitions/texcoord_attribute" }
            },
            "additionalProperties" : false
        },
        "metadataKeys" : {
            "type" : "array",
            "items" : {
              "type" : "string"
            }
        }
    },
    "additionalProperties" : false
}

塊。轉換設定.json 檔案看起來可能像下列範例:

{
    "scaling" : 0.01,
    "recenterToOrigin" : true,
    "material-override" : "box_materials_override.json"
}

轉換三角形網格和點雲的架構完全相同。 不過,相較于三角形網格轉換,點雲端轉換會使用嚴格的特徵子集。

三角形網格的設定

當您從 .fbx 檔案轉換三角形網格時, 上一節所示之架構範例中的所有參數都會影響轉換結果。 下一節會提供參數的詳細說明。

幾何參數

  • scaling:此參數會統一調整模型。 縮放可用來擴大或縮小模型,例如,在資料表頂端顯示建置模型。 當模型以計量以外的單位定義時,縮放比例也很重要,因為轉譯引擎需要計量。 例如,如果模型是以公分定義,則套用 0.01 的尺規會以正確的大小轉譯模型。 某些源資料格式(例如 .fbx 檔案)提供單位縮放提示。 在此情況下,轉換會隱含地將模型調整為計量單位。 來源格式所提供的隱含縮放比例會套用在 參數之上 scaling 。 最終縮放比例會套用至場景圖形節點的幾何頂點和本機轉換。 根實體轉換的縮放比例維持不變。

    重要

    展示和快速入門可能會補償任何轉換時間調整,因為它們都有內建的自動調整功能。 如需詳細資訊,請參閱 疑難排解指南

  • recenterToOrigin:此參數指出應該轉換模型,使其周框方塊置中于原點。 如果來源模型遠離原點,浮點精確度問題可能會導致轉譯成品。 將模型置中可在此案例中有所説明。

  • opaqueMaterialDefaultSidedness:轉譯引擎假設不透明材質是雙面的。 如果該假設不是特定模型的 True,此參數應該設定為 SingleSided 。 如需詳細資訊,請參閱 單邊轉譯

重復資料刪除

  • deduplicateMaterials:此參數會啟用或停用共用相同屬性和紋理之材質的自動重複資料刪除。 重復資料刪除會在處理材料覆寫之後發生。 此項目預設為啟用。

  • 如果模型在重復資料刪除之後擁有超過 65,535 個材質,服務就會嘗試合併具有類似屬性的材質。 最後一個選項是,超過限制的任何材質會由紅色錯誤材質取代。

下圖顯示兩個 68,921 個彩色三角形的立方體。 左側範例是在重復資料刪除之前,其色彩材質為 68,921。 正確的範例是在重復資料刪除之後,使用 64,000 種色彩材質。 限制為 65,535 材質。 如需有關材料限制的詳細資訊,請參閱 限制

Screenshot that shows two cubes of 68,921 colored triangles and the effect of deduplication.

色彩空間參數

轉譯引擎預期色彩值位於線性空間中。 如果使用 gamma 空間定義模型,則應該將下列選項設定為 true

  • gammaToLinearMaterial:將材質色彩從伽瑪空間轉換成線性空間。
  • gammaToLinearVertex:將頂點色彩從伽瑪空間轉換為線性空間。

注意

針對 FBX、E57、PLY、LAS、LAZ 和 XYZ 檔案格式,這些設定預設會設定為 true 。 針對所有其他檔案格式,預設值為 false

場景參數

  • sceneGraphMode:定義來源檔案中場景圖形的轉換方式。
    • dynamic (預設值):檔案中的所有物件都會公開為 API 中的實體 ,而且可以任意轉換和重新父系。 在執行時間,節點階層與來源檔案中的 結構相同。
    • static:類似于 dynamic ,但場景圖形中的物件無法在執行時間動態地重新父系至其他物件。 對於具有許多移動元件的動態模型,例如爆炸檢視, dynamic 此選項會產生更有效率的模型來轉譯,但 static 模式仍允許個別元件轉換。 如果不需要動態重新父系,此選項 static 最適合具有許多個別元件的模型。
    • none:場景圖形會折迭成一個物件。

每個模式都有不同的執行時間效能。 在 dynamic 模式中,效能成本會以線性方式調整圖形中的實體 數目 ,即使沒有移動任何元件也一般。 dynamic只有在需要同時移動許多元件或大型子圖形時,才使用模式。 例如爆炸檢視動畫。

模式 static 也會匯出完整的場景圖形。 空間查詢 會傳回個別部分,而且每個部分都可以透過 狀態覆 寫來修改。 使用此模式時,每個物件的執行時間額外負荷是微不足道的。 此模式適用于大型場景,您需要個別物件檢查和偶爾在個別元件上轉換變更,但沒有任何物件重新父系。

模式 none 的執行時間額外負荷最低,而且載入時間也稍微好一些。 無法在此模式中檢查或轉換單一物件。 例如,使用案例是未以有意義的場景圖形開頭的攝影測量模型。

提示

許多應用程式會載入多個模型。 您應該根據您將如何使用模型,將每個模型的轉換參數優化。 例如,如果您想要顯示汽車的模型,讓使用者能夠拆開並詳細檢查,請先使用 dynamic 模式加以轉換。 不過,如果您也想要將汽車放在顯示室環境中,您可以使用 設定為 static ,甚至將 none 模型 sceneGraphMode 轉換成 。

物理參數

  • generateCollisionMesh:如果您需要 支援模型上的空間查詢 ,則必須啟用此選項。 衝突網格產生不會增加額外的轉換時間,也不會增加輸出檔案大小。 具有衝突網格之模型的載入時間和執行時間成本只是微不足道更高。 除非您有特定理由從空間查詢中排除模型,否則您可以將此旗標保留為預設值(已啟用)。

未點亮材質

從舊版 FBX 格式和 Phong 材質模型轉換

  • fbxAssumeMetallic:舊版 FBX 格式會使用 Phong 材質模型來定義其材質。 轉換程式必須推斷這些材質如何對應至轉譯器的 PBR 模型 。 通常此對應效果良好,但當材質沒有紋理、高反射值和非灰色的反白色彩時,可能會產生模棱兩可的情況。 在此案例中,轉換必須選擇重設高反射值優先順序、定義高反射和金屬材質,讓反光和金屬材質消失,或藉由定義類似閃亮色彩的彩色塑膠來優先處理 albedo 色彩。 根據預設,轉換程式會假設高度反射值在模棱兩可的情況下表示金屬材質。 您可以針對相反的效果,將此參數 false 設定為 。

座標系統覆寫

  • axis:使用此參數覆寫座標系統單位向量。 預設值為 ["+x", "+y", "+z"] 。 從理論上講,FBX 格式具有定義這些向量的標頭,而轉換會使用該資訊來轉換場景。 GLTF 格式也會定義固定座標系統。 實際上,某些資產在其標頭中具有不正確的資訊,或使用不同的座標系統慣例來儲存。 此選項可讓您覆寫座標系統來補償。 例如, "axis" : ["+x", "+z", "-y"] 交換 Z 軸和 Y 軸,並藉由反轉 Y 軸方向來保持座標系統交接。

節點中繼資料

  • metadataKeys:使用此參數指定您要保留在轉換結果中的節點中繼資料屬性索引鍵。 您可以指定確切的索引鍵或萬用字元索引鍵。 萬用字元索引鍵的格式 ABC* 和比對開頭為 的任何索引鍵 ABC 。 支援的中繼資料實數值型別為 boolintfloatstring

    對於 GLTF 檔案,此資料來自 節點上 的額外物件。 對於 FBX 檔案,此資料來自 Properties70 上的 Model nodes 資料。 如需詳細資訊,請參閱 3D 資產工具的檔。

載入已啟用中繼資料的模型時,可以透過 非同步 QueryMetadataAsync 函式擷取特定實體的中繼資料專案清單。

頂點格式

您可以調整網格的頂點格式,以節省記憶體的精確度。 如果您的模型記憶體使用量較低,您可以載入較大的模型或達到更好的效能。 不過,視您的資料而定,錯誤的格式可能會大幅影響轉譯品質。

警告

當模型不再符合記憶體時,或當您優化以獲得最佳效能時,變更頂點格式應該是最後一個選項。 變更可以輕鬆地引進轉譯成品,既明顯又微妙。 除非您知道要注意什麼,否則您不應該變更預設值。

您可以進行下列調整:

  • 明確包含或排除特定資料流程。
  • 減少資料流程的正確性,以減少記憶體使用量。

JSON 檔案中的下一 vertex 節是選擇性的。 針對未明確指定的每個部分,轉換服務會回復為其預設設定。

{
    ...
    "vertex" : {
        "position"  : "32_32_32_FLOAT",
        "color0"    : "NONE",
        "color1"    : "NONE",
        "normal"    : "NONE",
        "tangent"   : "NONE",
        "binormal"  : "NONE",
        "texcoord0" : "32_32_FLOAT",
        "texcoord1" : "NONE"
    },
    ...
}

藉由強制元件到 NONE ,保證輸出網格沒有個別的資料流程。

每個頂點資料流程的元件格式

下表描述個別元件允許的格式:

頂點元件 支援的格式 材料中的使用方式
position 32_32_32_FLOAT 預設值 ), 16_16_16_16_FLOAT 頂點位置。 必須一律存在。
color0 8_8_8_8_UNSIGNED_NORMALIZED 預設值 ), NONE 頂點色彩。 請參閱 useVertexColor 色彩材質和 PBR 材質 以及 vertexMix 色彩材質 中的 屬性 。
color1 8_8_8_8_UNSIGNED_NORMALIZEDNONE 預設值 未使用的。 保留為預設 NONE
normal 8_8_8_8_SIGNED_NORMALIZED 預設值 ),, 16_16_16_16_FLOATNONE 用於 PBR 材質 中的 光源。
tangent 8_8_8_8_SIGNED_NORMALIZED 預設值 ),, 16_16_16_16_FLOATNONE 用於 PBR 材質 中具有一般地圖的 光源。
binormal 8_8_8_8_SIGNED_NORMALIZED 預設值 ),, 16_16_16_16_FLOATNONE 用於 PBR 材質 中具有一般地圖的 光源。
texcoord0 32_32_FLOAT 預設值 ),, 16_16_FLOATNONE 紋理座標的第一個位置。 像 albedo 和一般地圖這樣的個別紋理可以使用來源檔案中定義的位置 0 或 1。
texcoord1 32_32_FLOAT 預設值 ),, 16_16_FLOATNONE 紋理座標的第二個位置。 像 albedo 和一般地圖這樣的個別紋理可以使用來源檔案中定義的位置 0 或 1。

支援的元件格式

下表描述所支援元件格式的記憶體使用量:

格式 描述 每個頂點的位元組數
32_32_FLOAT 雙元件完整浮點精確度 8
16_16_FLOAT 雙元件半浮點精確度 4
32_32_32_FLOAT 三個元件的完整浮點精確度 12
16_16_16_16_FLOAT 四元件半浮點精確度 8
8_8_8_8_UNSIGNED_NORMALIZED 四個元件位元組,標準化為 [0; 1] 範圍 4
8_8_8_8_SIGNED_NORMALIZED 四個元件位元組,標準化為 [-1; 1] 範圍 4

元件格式變更的最佳做法

  • position:降低精確度很少就足夠了。 16_16_16_16_FLOAT 即使針對小型模型,也引進了明顯的量化成品。
  • normaltangentbinormal :一般而言,這些值會一起變更。 除非有明顯的光源成品導致正常量化,否則沒有理由增加其精確度。 不過,在某些情況下,這些元件可以設定為 NONE
    • normal只有在模型中至少應點選一個材質時,才需要 、 tangentbinormal 。 在 Azure 遠端轉譯中,每當模型上使用 PBR 材質 ,就會發生此案例。
    • tangent 只有在任何點亮材質使用一般地圖紋理時,才需要 和 binormal
  • texcoord0texcoord1 :當紋理座標的值保持在範圍中 [0; 1] ,且定址紋理的大小上限為 2,048 × 2,048 圖元時,紋理座標可以使用降低的精確度 ( 16_16_FLOAT )。 如果超過這些限制,紋理對應的品質就會降低。

範例

假設您有一個攝影測量模型,其光源已烘焙到紋理中。 轉譯模型所需的所有專案都是頂點位置和紋理座標。

根據預設,轉換器必須假設您可能想要在模型上使用 PBR 材質,因此它會為您產生 normaltangentbinormal 資料。 因此,每個頂點記憶體使用量是 position (12 個位元組) + texcoord0 (8 個位元組) + normal (4 個位元組) + tangent (4 個位元組) + binormal (4 個位元組) = 32 個位元組。 此類型的較大模型很容易有數百萬個頂點,導致可佔用數 GB 記憶體的模型。 這類大量資料會影響效能,甚至可能會耗盡記憶體。

知道您永遠不需要模型上的動態光源,而且知道所有紋理座標都在 [0; 1] 範圍內,您可以將 、 tangentbinormal 設定 normaltexcoord0NONE 半精確度 ( 16_16_FLOAT ),因此每個頂點只產生 16 個位元組。 當網格資料減半時,您可以載入較大的模型,而且效能可能會改善。

點雲端的設定

轉換點雲端時,只會使用架構中的一小部分屬性。 除非已指定其他屬性,否則會忽略其他屬性。

對點雲端轉換有影響的屬性如下:

  • scaling:與三角形網格相同的意義。
  • recenterToOrigin:與三角形網格相同的意義。
  • axis:與三角形網格相同的意義。 預設值為 ["+x", "+y", "+z"] ,但相較于轉譯器自己的座標系統,大部分的點雲端資料都會旋轉。 為了補償,在大部分情況下會 ["+x", "+z", "-y"] 修正旋轉。
  • gammaToLinearVertex:類似于三角形網格,此旗標會指出點色彩是否應該從伽瑪空間轉換成線性空間。 點雲端格式的預設值(E57、PLY、LAS、LAZ 和 XYZ 檔案) 為 true
  • generateCollisionMesh:類似于三角形網格,若要支援 空間查詢 ,您必須啟用此旗標。

記憶體優化

載入內容的記憶體耗用量可能會成為轉譯系統上的瓶頸。 如果記憶體承載變得太大,可能會危害轉譯效能,或造成模型完全無法載入。 此段落討論一些減少記憶體使用量的重要策略。

注意

下列優化適用于三角形網格。 您無法藉由設定轉換設定來優化點雲端的輸出。

執行個體

在實例中,網格會重複使用為具有不同空間轉換的元件,而不是參考其本身唯一幾何的每個部分。 實例對記憶體使用量有重大影響。

實例的範例使用案例是引擎模型中的螺絲或架構模型中的椅子。

注意

實例可以大幅改善記憶體耗用量(因此載入時間),但轉譯效能的改善卻微不足道。

如果元件在原始程式檔中據以標示,轉換服務會遵守實例。 不過,轉換不會對網格資料執行額外的深入分析,以識別可重複使用的元件。 內容建立工具及其匯出管線是適當實例設定的決定性準則。

在轉換期間測試實例資訊是否保留的簡單方式,就是查看 輸出統計資料 。 具體來說,請檢查 numMeshPartsInstanced 值。 如果 的值 numMeshPartsInstanced 大於零,則會跨實例共用網格。

範例:3ds Max 中的實例設定

Autodesk 3ds Max 具有稱為複製 實例 參考 的不同物件複製模式 。 模式的運作方式會因匯出 的 .fbx 檔案中的實例運作方式不同。

Screenshot that shows an example of cloning an object by using Autodesk 3ds Max.

  • 複製 :在此模式中,會複製網格,因此不會使用任何實例( = numMeshPartsInstanced0 )。
  • 實例 :這兩個物件共用相同的網格,因此會使用實例 ( = numMeshPartsInstanced1 )。
  • 參考 :不同的修飾詞可以套用至幾何,因此匯出者選擇保守的方法,而且不使用實例( = numMeshPartsInstanced0 )。

以深度為基礎的組合模式

如果記憶體是問題,請使用 深度型組合模式 來設定轉譯器。 在此模式中,GPU 承載會分散到多個 GPU。

減少頂點大小

如元件格式的最佳做法變更 中所述 ,調整頂點格式可能會降低記憶體使用量。 不過,此選項應該是您選擇的最後一個選項。

紋理大小

視案例類型而定,紋理資料的數量可能會超過用於網格資料的記憶體。 攝影測量模型是候選項目。 轉換組態不提供自動縮小紋理的方式。 如有必要,紋理縮放必須做為用戶端前置處理步驟。 但轉換步驟確實選擇適當的 紋理壓縮格式

  • BC1 不透明色彩紋理的檔案格式
  • 使用 Alpha 色板之來源色彩紋理的 BC7 檔案格式

由於 BC7 檔案格式的記憶體使用量是 BC1 檔案格式的兩倍,因此請務必確定輸入紋理不會提供不必要的 Alpha 色板。

一般使用案例

尋找特定使用案例的良好匯入設定可能是繁瑣的程式。 另一方面,轉換設定可能會對執行時間效能產生重大影響。

某些特定使用案例類別符合特定優化條件。 下列各節將說明一些範例。

使用案例:架構視覺效果或大型戶外地圖

針對涉及架構視覺效果或大型戶外地圖的案例,請考慮下列因素:

  • 這些類型的場景通常是靜態的。 它們不需要可移動的元件。 因此,您可以將 設定為 static ,或甚至設定 sceneGraphModenone ,並改善執行時間效能。 在 static 模式中,場景的根節點仍然可以移動、旋轉及縮放。 例如,它可以動態切換 1:1 小數位數(適用于第一人檢視),以及資料表頂端檢視。

  • 如果應用程式不使用 切割平面 opaqueMaterialDefaultSidedness 則旗標應該關閉。 效能提升通常是 20% 到 30%。 您仍然可以使用切割平面,但當您查看物件的內部部分時,不會有後臉,這看起來是反直覺的。 如需詳細資訊,請參閱 單邊轉譯

使用案例:攝影測量模型

當您轉譯攝影測量模型時,通常不需要場景圖形。 在此案例中,您可以選擇將 設定 sceneGraphModenone 。 因為這些模型很少包含複雜的場景圖形,因此選擇此選項的效果可能微不足道。 因為光源已經烘焙到紋理中,因此不需要動態光源。 在此情節中:

  • unlitMaterials 旗標設定為 true ,將所有材質變成未點亮 的色彩材質
  • 從頂點格式移除不需要的資料。 請參閱先前的 範例

使用案例:精簡電腦和其他電腦的視覺效果

在這些使用案例中,模型在少量中通常會有高度的詳細資料。 轉譯器已大幅優化以妥善處理這些案例。 不過,先前使用案例中所述的大部分優化都不適用於此處。 優化包括:

  • 個別元件應可選取且可移動,因此 sceneGraphMode 必須設定為 dynamic
  • 光線轉換通常是應用程式不可或缺的一部分,因此必須產生衝突網格。
  • 啟用旗標時 opaqueMaterialDefaultSidedness ,切割平面看起來會更好。

即將淘汰的功能

仍支援使用非模型特定 轉換來設定模型轉換參數設定.json 檔案名,但已被取代。 請改用模型特定的 < modelName > 。Conversion設定.json 檔案名。

仍支援使用 material-override 設定來識別 轉換設定檔案中的材質覆寫檔案 ,但已被取代。 請改用模型特定的 < modelName > 。MaterialOverrides.json 檔案名。

下一步