メインコンテンツまでスキップ

v0.122 KHR_texture_basisu 拡張対応

これは実験的機能です

KHR_texture_basisu 拡張 に対応する機能です。

KHR_texture_basisu 拡張を使用した glTF / VRM ファイルを用意することで、実行時ロードと描画の効率化が図れます。

対応するモデルと環境

モデルファイルに含まれる KTX basisu テクスチャは、予め上下反転しておく必要があります。

Editor ImportRuntime Import
通常のテクスチャ-TBD
上下反転したテクスチャ-
警告

Unity は内部的にすべてのテクスチャを上下反転しています。 したがって Runtime に圧縮テクスチャをインポートしようとした場合、上下反転した状態で圧縮しておくのが効率的です。 ただし上下反転した状態では glTF として正しい状態にはならないため、Unity 以外のツールでの利用には注意が必要です。

導入方法

1. KTX for Unity パッケージを導入

KTX for Unity パッケージが必要です。 パッケージ公式の導入方法 に従ってインストールしてください。

注記

UniVRM は KTX for Unity パッケージの存在を検知して、自動的に対応コードを有効化します。 具体的には USE_COM_UNITY_CLOUD_KTX シンボルが有効化されます

2. インポート時にオプションを有効化

glTF ファイルをパースして得られる GltfData クラスに存在する ExtensionSupportFlags プロパティを設定します。 具体的には以下の 2 点です。

  • GltfData.ExtensionSupportFlags.ConsiderKhrTextureBasisu
    • true に設定
    • モデルに定義されている KHR_texture_basisu 拡張を考慮してインポートすることを明示するフラグです。
  • GltfData.ExtensionSupportFlags.IsAllTexturesYFlipped
    • true に設定
    • モデルに含まれるテクスチャが Unity 専用に上下反転されていることを明示するフラグです。

これらを設定した GltfData を、通常の手順でインポートします。 以下がサンプルコードです。

public class LoadYFlippedBasisuModel : MonoBehaviour
{
async void Start()
{
await LoadGltfModelAsync();
await LoadVrm10ModelAsync();
}

async Task LoadGltfModelAsync()
{
var path = @"C:\foo\bar\baz.gltf";
using var data = new AutoGltfFileParser(path).Parse();

// NOTE: KHR_texture_basisu 拡張のロードを有効化します。これは Runtime でのみ有効です。
data.ExtensionSupportFlags.ConsiderKhrTextureBasisu = true;

// NOTE: 上下反転されたテクスチャを含むモデルの場合、このフラグを有効化します。
// 現在はこのフラグを有効化しないと読み込めません。
data.ExtensionSupportFlags.IsAllTexturesYFlipped = true;

using var loader = new ImporterContext(data);
var model = await loader.LoadAsync(new RuntimeOnlyAwaitCaller());
model.ShowMeshes();
}

async Task LoadVrm10ModelAsync()
{
var path = @"C:\foo\bar\baz.vrm";
using var data = new AutoGltfFileParser(path).Parse();

data.ExtensionSupportFlags.ConsiderKhrTextureBasisu = true;
data.ExtensionSupportFlags.IsAllTexturesYFlipped = true;

var vrm10Data = Vrm10Data.Parse(data);
using var loader = new Vrm10Importer(vrm10Data);
var model = await loader.LoadAsync(new RuntimeOnlyAwaitCaller());
model.ShowMeshes();
}
}

参考