v0.76
ITextureDeserializer(テクスチャーローダー)
このインタフェースを使うと, glTF のテクスチャーをロードして Unity の Texture2D を作成する工程をカスタマイズできます。
UnityTextureDeserializer
UniVRM が使用するデフォルトの実装は UnityTextureDeserializer
です。
ImageConversion.LoadImage を使用して png
や jpeg
から Texture2D に変換します。
ITextureDeserializer でパフォーマンスを改善
Texture2D の生成には複数のステップがあります。
png
やjpeg
からraw pixel
を取り出す- 取り出した
raw pixel
を使ってTexture2D
を作成する
前者をスレッドに乗せて非同期処理にすることで パフォーマンスを向上させる余地があります。
警告
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を使ってパフォーマンスを向上できます。