docs.unity3d.com
Search Results for

    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 Open, LoadTexture2D and Dispose for details.

    Trademarks

    Unity is a registered trademark of Unity Technologies.

    Khronos® and the Khronos Group logo are registered trademarks of the The Khronos Group Inc.

    KTX™ and the KTX logo are trademarks of the The Khronos Group Inc.

    In This Article
    Back to top
    Copyright © 2024 Unity Technologies — Trademarks and terms of use
    • Legal
    • Privacy Policy
    • Cookie Policy
    • Do Not Sell or Share My Personal Information
    • Your Privacy Choices (Cookie Settings)