docs.unity3d.com
    Show / Hide Table of Contents

    How To

    The API provides the loading classes KtxTexture for KTX 2.0 files and BasisUniversalTexture for Basis Universal files, which both offer the following async loading methods:

    • LoadFromUrl for loading URLs (including file URLs starting with file://)
    • LoadFromStreamingAssets for loading relative paths in the StreamingAssets folder
    • LoadFromBytes for loading from memory

    Loading Textures

    using KtxUnity;
    …
    async void Start() {
    
        // Create KTX texture instance
        var texture = new KtxTexture();
    
        // Linear color sampling. Needed for non-color value textures (e.g. normal maps) 
        bool linearColor = true;
    
        // Load file from Streaming Assets folder (relative path)
        var result = await texture.LoadFromStreamingAssets("trout.ktx", linearColor);
    
        // Alternative: Load from URL
        // var result = await texture.LoadFromUrl("https://myserver.com/trout.ktx", linearColor);
    
        // Alternative: Load from memory
        // var result = await texture.LoadFromBytes(nativeArray, linearColor);
    
        if (result != null) {
            // Use texture. For example, apply texture to a material
            targetMaterial.mainTexture = result.texture;
    
            // Optional: Support arbitrary texture orientation by flipping the texture if necessary
            var scale = targetMaterial.mainTextureScale;
            scale.x = result.orientation.IsXFlipped() ? -1 : 1;
            scale.y = result.orientation.IsYFlipped() ? -1 : 1;
            targetMaterial.mainTextureScale = scale;
        }
    }
    …
    

    Using as Sprite

    If you want to use the texture in a UI / Sprite context, this is how you create a Sprite with correct orientation:

    using KtxUnity;
    …
    async void Start() {
    
        // Create a basis universal texture instance
        var texture = new BasisUniversalTexture();
    
        // Load file from Streaming Assets folder
        var result = await texture.LoadFromStreamingAssets("dachstein.basis");
    
        if (result != null) {
            // Calculate correct size
            var pos = new Vector2(0,0);
            var size = new Vector2(result.texture.width, result.texture.height);
    
            // Flip Sprite, if required
            if(result.orientation.IsXFlipped()) {
                pos.x = size.x;
                size.x *= -1;
            }
    
            if(result.orientation.IsYFlipped()) {
                pos.y = size.y;
                size.y *= -1;
            }
    
            // Create a Sprite and assign it to the Image
            GetComponent<Image>().sprite = Sprite.Create(result.texture, new Rect(pos, size), Vector2.zero);
    
            // Preserve aspect ratio:
            // Flipping the sprite by making the size x or y negative (above) breaks Image's `Preserve Aspect` feature
            // You can/have to calculate the RectTransform size yourself. Example:
    
            // Calculate correct size and assign it to the RectTransform
            const float scale = 0.5f; // Set this to whatever size you need it - best make it a serialized class field
            var rt = GetComponent<RectTransform>();
            rt.sizeDelta = new Vector2(result.texture.width*scale, result.texture.height*scale);
        }
    }
    …
    

    Note: You can still use the Preserve Aspect Image option, if you encode your KTX/Basis files with flipped Y axis (see Creating Textures )

    Advanced

    Developers who want to create advanced loading code should look into classes KtxTexture/BasisUniversalTexture and TextureBase directly.

    When loading many textures at once, using the low-level API to get finer control over the loading process can yield great performance gains. Have a look at TextureBase.Load and for starting and details.

    Back to top
    Terms of use
    Copyright © 2023 Unity Technologies — Terms of use
    • Legal
    • Privacy Policy
    • Cookies
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)
    "Unity", Unity logos, and other Unity trademarks are trademarks or registered trademarks of Unity Technologies or its affiliates in the U.S. and elsewhere (more info here). Other names or brands are trademarks of their respective owners.
    Generated by DocFX on 18 October 2023