v0.76 ITextureDeserializer(テクスチャーローダー)
このインタフェースを使うと, glTF のテクスチャーをロードして Unity の Texture2D を作成する工程をカスタマイズできます。
UnityTextureDeserializer
UniVRM が使用するデフォルトの実装は UnityTextureDeserializer です。
ImageConversion.LoadImage を使用して png や jpeg から Texture2D に変換します。
ITextureDeserializer でパフォーマンスを改善
Texture2D の生成には複数のステップがあります。
pngやjpegからraw pixelを取り出す- 取り出した
raw pixelを使ってTexture2Dを作成する
前者をスレッドに乗せて非同期処理にすることで パフォーマン スを向上させる余地があります。
warning
ImageConversion.LoadImage は raw pixel 取り出しと Texture2D 作成を一度に実行し、
その間メインスレッドをブロックします。
大きなテクスチャーや大量のテクスチャーをロードすると画面が固まりやすくなります。
ITextureDeserializer で対応する画像形式を拡張する
通常の glTF はテクスチャー画像として png と jpeg を格納できます。
もし、EXT_texture_webp KHR_texture_basisu などで別の形式の画像を利用する場合は
ITextureDeserializer で対応可能です。
差し替え方法
new UniGLTF.ImporterContext の引き数で指定することができます。
public ImporterContext(
GltfData data,
IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
ITextureDeserializer textureDeserializer = null, // 👈
IMaterialDescriptorGenerator materialGenerator = null)
new VRM.VRMImporterContext の引き数で指定することができます。
public VRMImporterContext(
VRMData data,
IReadOnlyDictionary<SubAssetKey, Object> externalObjectMap = null,
ITextureDeserializer textureDeserializer = null, // 👈
IMaterialDescriptorGenerator materialGenerator = null,
bool loadAnimation = false)
new UniVRM10.Vrm10Importer の引き数で指定することができます。
public Vrm10Importer(
Vrm10Data vrm,
IReadOnlyDictionary<SubAssetKey, UnityEngine.Object> externalObjectMap = null,
ITextureDeserializer textureDeserializer = null, // 👈
IMaterialDescriptorGenerator materialGenerator = null,
bool useControlRig = false
)
UnityAsyncImageLoader に置き換える例
ISSUE に使用例をいただきました。
https://github.com/vrm-c/UniVRM/issues/1982
UnityAsyncImageLoaderを使ってパフォーマンスを向上できます。