Alpha premultiplied on UI Shader

Hi!
I’m using RenderHeads AVPro video system and i’m trying to importing a video clip with alpha.
The problem is that i have some transparent parts (opacity at 50%) that would be white and are rendered in gray.
So i’ve read some threads and i’ve tried to create a new UI shader and trying to use another blending way

Blend One OneMinusSrcAlpha

and then at the bottom

color.rgb*= color.a

something is working but not really good
if I try to

color.rgb+=color.rgb*color.a;
color.a*=color.a;

it’s near like in after effects (if a use alpha premultiplied)
I know this formula it’s a non sense but i cannot make it work, someone can help me? this is my final shader

// Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)

Shader "UI/Unlit-Premult"
{
    Properties
    {
         _MainTex ("Base (RGB), Alpha (A)", 2D) = "white" {}
        _Color ("Tint", Color) = (1,1,1,1)

        _StencilComp ("Stencil Comparison", Float) = 8
        _Stencil ("Stencil ID", Float) = 0
        _StencilOp ("Stencil Operation", Float) = 0
        _StencilWriteMask ("Stencil Write Mask", Float) = 255
        _StencilReadMask ("Stencil Read Mask", Float) = 255

        _ColorMask ("Color Mask", Float) = 15

        [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0
       
    }

    SubShader
    {
        Tags
        {
            "Queue"="Transparent"
            "IgnoreProjector"="True"
            "RenderType"="Transparent"
            "PreviewType"="Plane"
            "CanUseSpriteAtlas"="True"
        }

        Stencil
        {
            Ref [_Stencil]
            Comp [_StencilComp]
            Pass [_StencilOp]
            ReadMask [_StencilReadMask]
            WriteMask [_StencilWriteMask]
        }

        Cull Off
        Lighting Off
        ZWrite Off
        ZTest [unity_GUIZTestMode]
        Blend One OneMinusSrcAlpha    //premult alpha
        ColorMask [_ColorMask]

        Pass
        {
            Name "Default"
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #pragma target 2.0

            #include "UnityCG.cginc"
            #include "UnityUI.cginc"

            #pragma multi_compile_local _ UNITY_UI_CLIP_RECT
            #pragma multi_compile_local _ UNITY_UI_ALPHACLIP

            struct appdata_t
            {
                float4 vertex   : POSITION;
                float4 color    : COLOR;
                float2 texcoord : TEXCOORD0;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 vertex   : SV_POSITION;
                fixed4 color    : COLOR;
                float2 texcoord  : TEXCOORD0;
                float4 worldPosition : TEXCOORD1;
                UNITY_VERTEX_OUTPUT_STEREO
            };

            sampler2D _MainTex;
            fixed4 _Color;
            fixed4 _TextureSampleAdd;
            float4 _ClipRect;
            float4 _MainTex_ST;

            v2f vert(appdata_t v)
            {
                v2f OUT;
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
                OUT.worldPosition = v.vertex;
                OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);

                OUT.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);

                OUT.color = v.color * _Color;
                return OUT;
            }

            fixed4 frag(v2f IN) : SV_Target
            {
                half4 color = (tex2D(_MainTex, IN.texcoord) + _TextureSampleAdd) * IN.color;

                #ifdef UNITY_UI_CLIP_RECT
                color.a *= UnityGet2DClipping(IN.worldPosition.xy, _ClipRect);
                #endif

                #ifdef UNITY_UI_ALPHACLIP
                clip (color.a - 0.001);
                #endif
                color.rgb*=color.a;
                color.a*=color.a;
               
                //return half4(color.rgb+(color.rgb*color.a),color.a*color.a);
                return color;
            }
        ENDCG
        }
    }
}

I’ve found this explanation seems fit prefectly but I’ve tried also to put only Blend One OneMinusSrcAlpha and leave the color as normal and didn’t work also…

Premultiplied Alpha Blending
There is an important variant of alpha blending: sometimes the fragment output color has its alpha component already premultiplied to the color components. (You might think of it as a price that has VAT already included.) In this case, alpha must not be multiplied again to the colors (corresponding to a rule that VAT must not be added more than once) and the correct blending is:

Blend One OneMinusSrcAlpha

which corresponds to:

float4 result = float4(1.0, 1.0, 1.0, 1.0) * fragment_output + (float4(1.0, 1.0, 1.0, 1.0) - fragment_output.aaaa) * pixel_color;

Two common mistakes in computer graphics are 1) to use the blend equation for standard alpha blending with premultiplied colors and 2) to use the blend equation for premultiplied alpha blending with colors that are not premultiplied. The visual errors caused by these mistakes can be quite subtle; usually they show up as either darkened or lightened silhouettes of blended objects. Thus, whenever you program a blend equation, make sure that you know whether you are dealing with premultiplied colors or not.

I’ve solved this by appling the blending option Blend One OneMinusSrcAlpha I don’t know why, i was into a testing code labyrith, Started from scratch now works like a charm just adding the correct blend!