v0.122 KHR_texture_basisu 拡張対応
これは実験的機能です
KHR_texture_basisu 拡張 に対応する機能です。
KHR_texture_basisu 拡張を使用した glTF / VRM ファイルを用意することで、実行時ロードと描画の効率化が図れます。
対応するモデルと環境
モデルファイルに含まれる KTX basisu テクスチャは、予め上下反転しておく必要があります。
Editor Import | Runtime 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();
}
}