Search Unity

ETC1 + Alpha Feature

Discussion in '2D' started by LingoDev2, Aug 26, 2015.

  1. TobyKaos

    TobyKaos

    Joined:
    Mar 4, 2015
    Posts:
    214
    For animation with several Atlas it is hard to do. I must separate FX animation in proper Atlas and switch alpha texture on shader at start of animation.
     
  2. TobyKaos

    TobyKaos

    Joined:
    Mar 4, 2015
    Posts:
    214
    And I just know that with 1 shader to compose sprite alpha you can only have one atlas texture in the scene currecntly view.

    I have 2 atlas, then I must create 2 shaders. damned
     
  3. AMess

    AMess

    Joined:
    Sep 9, 2015
    Posts:
    5
    Hi, what's the bug's status? I still have the problem in 5.3.2f1.
     
  4. BartNT

    BartNT

    Joined:
    Sep 12, 2013
    Posts:
    15
    Any news? Is there any method to get ETC1 + Alpha working for sprites on Android? I've tried with many options and it always generates ETC2 texture in build instead of ETC1 + Alpha (for both: single sprites and atlases) :/

    @sandboxed are you there? ;)
     
  5. McM4rt

    McM4rt

    Joined:
    Aug 6, 2013
    Posts:
    6
    Hey all!
    We have got ETC1 + Alpha working for UI Image components by recompiling the Unity UI Library with some custom code. The code basically creates a new material for each sprite atlas group and page at runtime and assigns it to each Image component instance. The new material uses the UI-DefaultAlpha shader already shown here.

    1. Add the following code to UnityEngine.UI/UI/Core/Image.cs:
    Code (csharp):
    1.  
    2. /***************************** Begin: ETC1 + Alpha Support *****************************/
    3. private static Dictionary<Texture2D, Material> s_UIMaterials = new Dictionary<Texture2D, Material>();
    4.  
    5. void AssignAlphaMaterial(Sprite sprite)
    6. {
    7.     if (sprite != null && Application.isPlaying && sprite.associatedAlphaSplitTexture != null)
    8.     {
    9.         if (s_UIMaterials.ContainsKey(sprite.texture))
    10.         {
    11.             m_Material = s_UIMaterials[sprite.texture];
    12.         }
    13.         else
    14.         {
    15.             Shader shader = Shader.Find("UI/DefaultAlpha");
    16.             if (shader != null)
    17.             {
    18.                 Material newMaterial = new Material(shader);
    19.                 newMaterial.name = newMaterial.name + "_" + sprite.texture.name;
    20.                 newMaterial.SetTexture("_AlphaTex", sprite.associatedAlphaSplitTexture);
    21.                 s_UIMaterials[sprite.texture] = newMaterial;
    22.  
    23.                 m_Material = newMaterial;
    24.             }
    25.             else
    26.                 Debug.LogError("Missing Shader UI/DefaultAlpha");
    27.         }
    28.     }
    29.     else
    30.     {
    31.         m_Material = s_DefaultUI;
    32.     }
    33. }
    34.  
    35. protected override void UpdateMaterial()
    36. {
    37.     AssignAlphaMaterial(this.sprite);
    38.     base.UpdateMaterial();
    39. }
    40.  
    41. protected override void Start()
    42. {
    43.     base.Start();
    44.     AssignAlphaMaterial(this.sprite);
    45. }
    46. /***************************** End: ETC1 + Alpha Support *****************************/
    47.  
    2. Add this shader to your project:
    Code (csharp):
    1.  
    2. Shader "UI/DefaultAlpha"
    3. {
    4.     Properties
    5.     {
    6.         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
    7.         [PerRendererData] _AlphaTex ("Alpha Texture", 2D) = "white" {}
    8.         _Color ("Tint", Color) = (1,1,1,1)
    9.      
    10.         _StencilComp ("Stencil Comparison", Float) = 8
    11.         _Stencil ("Stencil ID", Float) = 0
    12.         _StencilOp ("Stencil Operation", Float) = 0
    13.         _StencilWriteMask ("Stencil Write Mask", Float) = 255
    14.         _StencilReadMask ("Stencil Read Mask", Float) = 255
    15.  
    16.         _ColorMask ("Color Mask", Float) = 15
    17.  
    18.         [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
    19.     }
    20.  
    21.     SubShader
    22.     {
    23.         Tags
    24.         {
    25.             "Queue"="Transparent"
    26.             "IgnoreProjector"="True"
    27.             "RenderType"="Transparent"
    28.             "PreviewType"="Plane"
    29.             "CanUseSpriteAtlas"="True"
    30.         }
    31.      
    32.         Stencil
    33.         {
    34.             Ref [_Stencil]
    35.             Comp [_StencilComp]
    36.             Pass [_StencilOp]
    37.             ReadMask [_StencilReadMask]
    38.             WriteMask [_StencilWriteMask]
    39.         }
    40.  
    41.         Cull Off
    42.         Lighting Off
    43.         ZWrite Off
    44.         ZTest [unity_GUIZTestMode]
    45.         Blend SrcAlpha OneMinusSrcAlpha
    46.         ColorMask [_ColorMask]
    47.  
    48.         Pass
    49.         {
    50.         CGPROGRAM
    51.             #pragma vertex vert
    52.             #pragma fragment frag
    53.  
    54.             #include "UnityCG.cginc"
    55.             #include "UnityUI.cginc"
    56.  
    57.             #pragma multi_compile __ UNITY_UI_ALPHACLIP
    58.          
    59.             struct appdata_t
    60.             {
    61.                 float4 vertex   : POSITION;
    62.                 float4 color    : COLOR;
    63.                 float2 texcoord : TEXCOORD0;
    64.             };
    65.  
    66.             struct v2f
    67.             {
    68.                 float4 vertex   : SV_POSITION;
    69.                 fixed4 color    : COLOR;
    70.                 half2 texcoord  : TEXCOORD0;
    71.                 float4 worldPosition : TEXCOORD1;
    72.             };
    73.          
    74.             fixed4 _Color;
    75.             fixed4 _TextureSampleAdd;
    76.             float4 _ClipRect;
    77.  
    78.             v2f vert(appdata_t IN)
    79.             {
    80.                 v2f OUT;
    81.                 OUT.worldPosition = IN.vertex;
    82.                 OUT.vertex = mul(UNITY_MATRIX_MVP, OUT.worldPosition);
    83.  
    84.                 OUT.texcoord = IN.texcoord;
    85.              
    86.                 #ifdef UNITY_HALF_TEXEL_OFFSET
    87.                 OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
    88.                 #endif
    89.              
    90.                 OUT.color = IN.color * _Color;
    91.                 return OUT;
    92.             }
    93.  
    94.             sampler2D _MainTex;
    95.             sampler2D _AlphaTex;
    96.             float AlphaEnable;
    97.  
    98.             fixed4 frag(v2f IN) : SV_Target
    99.             {
    100.                 half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;
    101.                 fixed4 alpha = tex2D (_AlphaTex, IN.texcoord) + _TextureSampleAdd;
    102.                 color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
    103.              
    104.                 #ifdef UNITY_UI_ALPHACLIP
    105.                 clip (color.a - 0.001);
    106.                 #endif
    107.                 color.a = color.a * alpha.r;
    108.                 return color;
    109.             }
    110.         ENDCG
    111.         }
    112.     }
    113. }
    114.  
    3. Add the shader to the list of "Always Included Shaders" under Graphics Settings. Otherwise it will not be included in the project if you create a build for the device.

    To get this working, your sprite textures have to be compressed with the "Compress using ETC1 (split alpha channel)" option and have to be packed on an atlas (using the packing tag). In the Build Settings the Texture Compression has to be set to "ETC (default)".

    The nice thing about this solution is that you do not have to change anything in your UI prefabs. No added scripts, no custom materials. It just works out of the box.
     
    Last edited: Apr 13, 2016
  6. BartNT

    BartNT

    Joined:
    Sep 12, 2013
    Posts:
    15
    Wow, Thanks McM4rt!

    This was the key for having ETC1+Alpha generated (besides format settings for single texture)!

    But there is another issue. When I have two sprites on the scene (not UI but simple objects with sprite renderers) and one of them is based on ETC1+Alpha atlas and another on truecolor atlas I've got some render issues (in playmode and on device).

    In editor (edit mode):

    edit.png

    In editor (playmode) or on devices:

    play.png

    It looks like some render states or shader params are not cleared between rendering.
    Both objects use Sprites-Default material. Tested on Unity 5.3.4p3.

    Do you notice the same problem? Could you test this simple case guys, please? It looks like ETC1+Alpha feature is still broken :/
     
    Last edited: Apr 13, 2016
  7. McM4rt

    McM4rt

    Joined:
    Aug 6, 2013
    Posts:
    6
    Hey BartNT,
    I can reproduce your issue. IMHO the problem is as follows: the ETC1 + Alpha feature seems to work for SpriteRenderers but only if the Sprites are compressed correctly, as is the case for the sprite on the left. The sprite on the right however is originally in truecolor. The "ETC (default)" override in your build settings forces it to be compressed with ETC1, though apparently without the additional alpha texture. This results in the behaviour you are observing.
     
  8. BartNT

    BartNT

    Joined:
    Sep 12, 2013
    Posts:
    15
    Thanks for the test @McM4rt!

    The "ETC (default)" overrides only compressed textures. So, all truecolor formats remain the same and I see correct RGBA format in deployed build. And when there are only truecolor objects on the screen everything looks correct.

    But I've discovered where is the problem. Unity doesn't change shader when renders two sprites (with different textures format) like above. You can see it in frame debugger. Even with disabled batching both objects are rendered with this variant of shader:

    two_objects.png


    When you remove the first ETC1+Alpha sprite from the scene you will see correct shader (without external alpha) for truecolor object:

    one_object.png


    and my tree is rendered correctly. So, it is definitely bug in Unity.
     
    Last edited: Apr 13, 2016
  9. McM4rt

    McM4rt

    Joined:
    Aug 6, 2013
    Posts:
    6
    Ah, good to know. Thanks. :)
    Very interesting to see how Unity handles this case internally.
     
  10. erictang

    erictang

    Joined:
    Jul 28, 2012
    Posts:
    15
    by the way , PVRTC RGB 4bit + Alpha ,(because of PVRTC RGBA 4bit artifacting...) how can I do ?For IOS
     
    bluescrn likes this.
  11. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
    This is still happening in UT5.3.5 - this is terrible for us and hasn't been fixed for ages now, we just can't compress any texture on old devices like the s3 which is still one of the most popular android devices.
    You can't compress any UI texture. I can't compress effects or animations since other elements are uncompressed and everything starts to flicker like crazy. and using everything uncompressed crashes the device.
     
  12. sandboxed

    sandboxed

    Unity Technologies

    Joined:
    Apr 6, 2015
    Posts:
    95
    Hey guys,
    sorry for the late arrival to this thread.

    The tree rendering is a bug with unity, and we are looking into fixing it asap.
     
  13. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
    Thanks sandboxed, any ETA on this bug?
     
  14. sandboxed

    sandboxed

    Unity Technologies

    Joined:
    Apr 6, 2015
    Posts:
    95
    I'll post an update as soon as its fixed in 5.3.
    Currently the fix is under review, and then we will backport it to 5.3.

    Sorry thats all that I can give for ETA.
     
    MrEsquire likes this.
  15. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
    Ok, Thanks
     
  16. xCyborg

    xCyborg

    Joined:
    Oct 4, 2010
    Posts:
    633
    Does that mean ETC1 + Alpha is unavailable for simple sprites or custom-made atlases? Well what's the point then?! I'm sick and tired of half-baked solutions Unity... one of which BTW is the lousy sprite packer algorithm which is why I can't use it, so you caught me in your endless mediocrity vicious circle again, thanks.
     
    Last edited: May 31, 2016
  17. yev-ponomarev

    yev-ponomarev

    Joined:
    Nov 11, 2015
    Posts:
    1
    Hi McM4rt!
    How to do that? =)
     
  18. Xiaobin83

    Xiaobin83

    Joined:
    Apr 20, 2015
    Posts:
    2
    I think this is a better version. It's not a intrusive modification (no need to re-compile UI.dll), it extends Image.cs. And use for those sprites which has atlas tag. And for those in Resources, use Image instead.
    It uses the similar shader to @McM4rt's. And code SplitAlphaMaterial is a modification from StencilMaterial.cs in UI code.
    The short part of this code, is you have to provide custom material which use shader mentioned above.
    Code (csharp):
    1.  
    2. public class ImageETC1 : UnityEngine.UI.Image
    3.    {
    4.      Texture alphaTexture
    5.      {
    6.        get
    7.        {
    8.          if (overrideSprite == null)
    9.          {
    10.            return null;
    11.          }
    12.          return overrideSprite.associatedAlphaSplitTexture;
    13.        }
    14.      }
    15.  
    16.      protected override void Awake()
    17.      {
    18.        base.Awake();
    19.        if (Application.isPlaying)
    20.        {
    21.          hideFlags = HideFlags.DontSave;
    22.        }
    23.      }
    24.  
    25.      Material m_SplitAlphaMaterial;
    26.      public override Material GetModifiedMaterial(Material baseMaterial)
    27.      {
    28.        if (!Application.isPlaying)
    29.        {
    30.          return base.GetModifiedMaterial(baseMaterial);
    31.        }
    32.  
    33.        var toUse = baseMaterial;
    34.  
    35.        // split alpha
    36.        toUse = SplitAlphaMaterial.Add(toUse, alphaTexture);
    37.        SplitAlphaMaterial.Remove(m_SplitAlphaMaterial);
    38.        m_SplitAlphaMaterial = toUse;
    39.  
    40.        bool useSplitAlpha = (toUse != baseMaterial);
    41.  
    42.  
    43.        // maskable
    44.        if (m_ShouldRecalculateStencil)
    45.        {
    46.          var rootCanvas = MaskUtilities.FindRootSortOverrideCanvas(transform);
    47.          m_StencilValue = maskable ? MaskUtilities.GetStencilDepth(transform, rootCanvas) : 0;
    48.          m_ShouldRecalculateStencil = false;
    49.        }
    50.  
    51.        // if we have a Mask component then it will
    52.        // generate the mask material. This is an optimisation
    53.        // it adds some coupling between components though :(
    54.        if (m_StencilValue > 0 && GetComponent<Mask>() == null)
    55.        {
    56.          var maskMat = StencilMaterial.Add(toUse, (1 << m_StencilValue) - 1, StencilOp.Keep, CompareFunction.Equal, ColorWriteMask.All, (1 << m_StencilValue) - 1, 0);
    57.          StencilMaterial.Remove(m_MaskMaterial);
    58.          m_MaskMaterial = maskMat;
    59.          toUse = m_MaskMaterial;
    60.          if (useSplitAlpha)
    61.          {
    62.            toUse.SetTexture("_AlphaTex", alphaTexture);
    63.          }
    64.        }
    65.        return toUse;
    66.      }
    67.  
    68.  
    Code (csharp):
    1.  
    2. using UnityEngine;
    3. using System.Collections;
    4. using System.Collections.Generic;
    5.  
    6. namespace UnityEngine.UI.Ext
    7. {
    8.  
    9.    public static class SplitAlphaMaterial
    10.    {
    11.  
    12.      class MatEntry
    13.      {
    14.        public Material baseMat;
    15.        public Texture alphaTexture;
    16.        public Material customMat;
    17.        public int count;
    18.      }
    19.  
    20.      static List<MatEntry> matList = new List<MatEntry>();
    21.  
    22.  
    23.      public static Material Add(Material baseMaterial, Texture alphaTexture)
    24.      {
    25.        if (alphaTexture == null)
    26.          return baseMaterial;
    27.  
    28.        for (int i = 0; i < matList.Count; ++i)
    29.        {
    30.          var mat = matList[i];
    31.          if (mat.baseMat == baseMaterial
    32.            && mat.alphaTexture == alphaTexture)
    33.          {
    34.            ++mat.count;
    35.            return mat.customMat;
    36.          }
    37.        }
    38.  
    39.        var newEnt = new MatEntry();
    40.        newEnt.count = 1;
    41.        newEnt.baseMat = baseMaterial;
    42.        newEnt.alphaTexture = alphaTexture;
    43.        newEnt.customMat = new Material(baseMaterial);
    44.        newEnt.customMat.hideFlags = HideFlags.HideAndDontSave;
    45.        newEnt.customMat.name = string.Format("SplitAlpha: {0} {1}", baseMaterial.name, alphaTexture.name);
    46.        newEnt.customMat.EnableKeyword("USE_SPLIT_ALPHA");
    47.        newEnt.customMat.SetTexture("_AlphaTex", alphaTexture);
    48.        matList.Add(newEnt);
    49.  
    50.        return newEnt.customMat;
    51.      }
    52.  
    53.      static void DestroyImmediate(Object obj)
    54.      {
    55.        if (obj != null)
    56.        {
    57.          if (Application.isEditor) Object.DestroyImmediate(obj);
    58.          else Object.Destroy(obj);
    59.        }
    60.      }
    61.  
    62.      public static void Remove(Material customMat)
    63.      {
    64.        if (customMat == null)
    65.          return;
    66.  
    67.        for (int i = 0; i < matList.Count; ++i)
    68.        {
    69.          MatEntry ent = matList[i];
    70.  
    71.          if (ent.customMat != customMat)
    72.            continue;
    73.          if (--ent.count == 0)
    74.          {
    75.            DestroyImmediate(ent.customMat);
    76.            ent.baseMat = null;
    77.            matList.RemoveAt(i);
    78.          }
    79.          return;
    80.        }
    81.      }
    82.    }
    83. }
    84.  
     
  19. McM4rt

    McM4rt

    Joined:
    Aug 6, 2013
    Posts:
    6
    Yes, not having to recompile the UI library is definitely a plus. However, my solution is better suited for projects that already have an extensive UI with lots of Image components. In this case you don't have to modify anything in your existing prefabs. It just works as is. That's why we chose it. We already had a working UI with many prefabs that would have been quite some work to update.

    When starting a new project or building a UI from scratch, your solution is probably the way to go.
     
  20. McM4rt

    McM4rt

    Joined:
    Aug 6, 2013
    Posts:
    6
    Hey Yev,

    the Unity UI code (amongst others) is open source. You can download it here: https://bitbucket.org/Unity-Technologies/ui/downloads. Once you did that, you can apply the changes mentioned in my post and then recompile it using Visual Studio 2015. Then you replace the original UI DLL in the Unity installation folder (in \Editor\Data\UnityExtensions\Unity\GUISystem) with your newly created one.

    Our project is running on Unity 5.3.4p1 and we used the 5.3.2f1 version of the GUISystem for our patch as no newer version was available at that time. I can't guarantee that newer versions will work with this.

    Good luck.
     
    Last edited: Jun 27, 2016
  21. dardanele05

    dardanele05

    Joined:
    Jun 23, 2016
    Posts:
    1
    Hi McM4rt

    I tried your way of implementing etc1 + alpha for UI images, and in play mode works fine but when i run my build on the phone alpha is still broken. Even if there is only one UI image on the scene.
    I did all steps and checked all options that you've mentioned. Did you tried it on any newer version of unity? My is 5.3.5.

    Someone had the same problem?
     
  22. lemon_pan

    lemon_pan

    Joined:
    Jun 27, 2016
    Posts:
    2
    Thanks McM4rt, your solution help me a lot!

    But I has another problem here, the memory usage ETC1 + alpha is more than ETC2.
    I checked from profiler on Android device, by default a texture 2048x2048 used 4MB (should be compressed ETC2 ), used ETC1 + split alpha, same texture used 2MB for the RGB (ETC1) and 4MB for alpha texture! What is the alpha texture format ? How should I reduce the memory usage not more than original usage?

    By the way, my unity version is 5.3.4f1, android devices is Nexus5.
     

    Attached Files:

  23. Percy-Pea

    Percy-Pea

    Joined:
    Aug 31, 2014
    Posts:
    75
    Pretty certain the alpha image is 8bit uncompressed. Quite likely Alpha8. I think some people have tried using the red channel from a separate ETC texture and creating a shader to use that to change the alpha values in your main texture. Sadly it's a little more work than Unitys built in ETC + Alpha and I'd guess you'd have to custom make your alpha channel texture.
     
  24. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
    This bug is still happening in Unity 5.4 - I am getting really frustrated with all Unity releases from version 5.2+ just 70% of the time I'm trying to do voodoo magic to override bugs
     
  25. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
  26. UVMarko

    UVMarko

    Joined:
    Sep 22, 2013
    Posts:
    15
    also UI Images using ETC1 compression - works in the editor but displays as a solid magenta on the device (Galaxy S3) (as an unsupported shader). so basically nothing is fixed in terms of ETC1 compression and android for UT 5.4, things actually regressed in UT5.4 since everything starts to flicker if you use Compressed and Uncompressed textures. @sandboxed what's the status on this? this is taking so much of my time

    * EDIT: Adding Default/ETC1 to the list of always included shaders seems to fix the UI shader bug on the device.
     
    Last edited: Aug 8, 2016
  27. r-pedra

    r-pedra

    Joined:
    Dec 4, 2015
    Posts:
    104
    hey guys,
    Sorry if this is not the main discussion, but I have a question.
    I can't find if there is a way to access the alpha channel without using a Unity Sprite.
    We are using NGUI and I already made a custom shader using ETC1 + another alpha 8 texture but it seems ETC1+alpha use less memory on disk.
    Is it possible to do so or not? (A magic field Texture2D.alphaChannel would be awesome ahah)
     
  28. Yaukey

    Yaukey

    Joined:
    Feb 25, 2013
    Posts:
    8
    Hi, @sandboxed , is "Compress using ETC1 (split alpha channel)" only for ui texture sprite, it has not effect for normal texture on android, because i set a texture used in scene with the flag of "Compress using ETC1 " in the android tab, override the texture compress setting to "ETC(defaut)" on build setting, and run on an opengl es device, print the format of the texture, still shows “ETC2_RGBA8“, so i'm a little bit confused.
    Btw, as opengl es 2.0 only support ETC1, why did i get "ETC2_RGBA8" format on the es2.0 device, did unity changed to internal format, but still show the original format, still confused about this.
    --------------------------------
    Update:
    I test on opengl es 2.0 android device with a etc2 compressed texture, the Texture2D returns the ETC2_RGBA8, but when i connect the profiler to the device and check the size of this 512x512 texture, i got 1.3mb which supposed to be 341.4kb of etc2 format, that equals with the size when i set it as rgba32 bit in editor.
    btw, i found a 1024x1024 texture with alpha, should be 4mb when set format of rgba32bit, but the preview window show 5.3mb, which is bigger. if set to rgb24bit, the size is 4mb, is that a bug or does unity just add something extra info into it?
     
    Last edited: Aug 11, 2016
  29. r-pedra

    r-pedra

    Joined:
    Dec 4, 2015
    Posts:
    104
    Check the beggining of the logcat when you run it on Android.
    You should see something like "Unsupported texture format: Uncompressing it". This means that the texture has bean uncompressed to RGBA32 (I think this is this format)
     
  30. Yaukey

    Yaukey

    Joined:
    Feb 25, 2013
    Posts:
    8
    Hi, r-pedra thanks, i have not noticed it before, i will try it out.
     
  31. HarryHimself

    HarryHimself

    Joined:
    Oct 6, 2016
    Posts:
    1
    Has this been fixed yet?

    It states on https://issuetracker.unity3d.com/is...-when-the-used-sprite-is-with-packing-tag-set that this issue was fixed in 5.5. But I still can't get the transparency working for UI Image elements using the Sprite-default material to allow all the ETC1 compressed sprites in the sprite packer to be batched correctly. Works fine with SpriteRenderer elements just not UI, currently using Unity 5.6.

    Any help with this would be greatly appreciated, sunk a number of hours into this and still haven't had any luck.
     
  32. denisbondare

    denisbondare

    Joined:
    Jun 19, 2016
    Posts:
    1
    Adding UI/DefaultETC1 Shader to the Always Included Shader list helped me on Unity 5.5! UI works properly, but now i have problems with SpriteRenderers :-D
     
    Last edited: May 16, 2017
  33. vzlomvl

    vzlomvl

    Joined:
    Jun 25, 2016
    Posts:
    43
    rszalski likes this.
  34. rszalski

    rszalski

    Joined:
    Feb 18, 2017
    Posts:
    1
  35. vzlomvl

    vzlomvl

    Joined:
    Jun 25, 2016
    Posts:
    43
     
  36. bluescrn

    bluescrn

    Joined:
    Feb 25, 2013
    Posts:
    642
    Is this feature still Android-only, when it would equally beneficial for iOS? (two PVR textures, one for RGB and one for alpha - to give cleaner results than PVR-with-alpha?)

    Back in the NGUI days, it was fairly straightforward to modify the texture packer to output two textures - but the Unity sprite packer and it's output seems a bit of a black box that we don't seem to have much control over via scripts :(