Режимы смешивания для ugui (Blend Modes)

Шейдеры и все-все-все.

Режимы смешивания для ugui (Blend Modes)

Сообщение eonyanov 20 фев 2016, 15:24

Всем привет.
Сделал простой Unlit шейдер из шаблона юнити.
Установил режим смешивания

Синтаксис:
Используется csharp
Blend SrcAlpha OneMinusSrcAlpha


Добавил материал с этим шейдером на Image (uGui компонента) и вот беда, не видно картинку, если она перекрывается другой картинкой.
И даже порядок в иерархии не важен. Нашел один только способ, менять Z координату. Но для uGUI это извращение какое-то получается.

Может кто подскажет, как обойти эту проблему?

Весь код шейдера:
Синтаксис:
Используется csharp
Shader "MyCustom/LinearAndColorDodge"
{
        Properties
        {
                _MainTex ("Texture", 2D) = "white" {}
                _LinearDodge("LinearDodge", Color) = (1,1,1,1)
                _ColorDodge("ColorDodge", Color) = (1,1,1,1)
                _PatternTex("Pattern", 2D) = "white" {}
        }
        SubShader
        {
                Tags { "RenderType"="Transparent" }
                Blend SrcAlpha OneMinusSrcAlpha
                LOD 100

                Pass
                {
                        CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        // make fog work
                        #pragma multi_compile_fog
                       
                        #include "UnityCG.cginc"

                        struct appdata
                        {
                                float4 vertex : POSITION;
                                float2 uv : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float2 uv : TEXCOORD0;
                                float2 uv2: TEXCOORD1;
                                UNITY_FOG_COORDS(1)
                                float4 vertex : SV_POSITION;
                        };

                        sampler2D _MainTex;
                        uniform float4 _MainTex_ST;
                        float4 _LinearDodge;
                        float4 _ColorDodge;
                        sampler2D _PatternTex;
                        float4 _PatternTex_ST;
                       
                        v2f vert (appdata v)
                        {
                                v2f o;
                                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                                o.uv2 = TRANSFORM_TEX(v.uv, _PatternTex)
                                UNITY_TRANSFER_FOG(o,o.vertex);
                                return o;
                        }
                       
                        fixed4 frag (v2f i) : SV_Target
                        {
                                // sample the texture
                                fixed4 col = (tex2D(_MainTex, i.uv) * tex2D(_PatternTex, i.uv2) + _LinearDodge)/(1 - _ColorDodge);
                                // apply fog
                                UNITY_APPLY_FOG(i.fogCoord, col);
                                col.rgb *= tex2D(_MainTex, i.uv).a;
                                return col;
                        }
                        ENDCG
                }
        }
}
 
Glow Asteroids Game
Happy Chair
Аватара пользователя
eonyanov
UNITрон
 
Сообщения: 298
Зарегистрирован: 22 авг 2014, 10:28

Re: Режимы смешивания для ugui (Blend Modes)

Сообщение eonyanov 25 фев 2016, 17:16

Переписал шейдер на основе стандартного UI-Default.shader (не знаю, че сразу так не сделал).
Теперь работает корректно.
Очень узконаправленный шейдер.
А именно (порядок важен):
-Добавляет наложение "узора".
-Добавляет наложение цвета в режиме LinearDodge
-Добавляет наложение цвета в режиме ColorDodge

Кстати, чтоб текстура тайлилась на всё картинку, нужно в настройках текстуры выставить Repeat вместо Clamp.

Синтаксис:
Используется csharp
Shader "MyCustom/LinearAndColorDodge"
{
        Properties
        {
                [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
                _LinearDodge("LinearDodge", Color) = (1,1,1,1)
                _ColorDodge("ColorDodge", Color) = (1,1,1,1)
                _PatternTex("Pattern", 2D) = "white" {}
        }

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

                Cull Off
                Lighting Off
                ZWrite Off
                ZTest [unity_GUIZTestMode]
                Blend SrcAlpha OneMinusSrcAlpha

                Pass
                {
                CGPROGRAM
                        #pragma vertex vert
                        #pragma fragment frag
                        #include "UnityCG.cginc"
                       
                        struct appdata_t
                        {
                                float4 vertex   : POSITION;
                                float4 color    : COLOR;
                                float2 texcoord : TEXCOORD0;
                        };

                        struct v2f
                        {
                                float4 vertex   : SV_POSITION;
                                fixed4 color    : COLOR;
                                half2 texcoord  : TEXCOORD0;
                                half2 texcoord1  : TEXCOORD1;
                        };
                       
                        sampler2D _MainTex;
                        uniform float4 _MainTex_ST;
                        float4 _LinearDodge;
                        float4 _ColorDodge;
                        sampler2D _PatternTex;
                        float4 _PatternTex_ST;

                        v2f vert(appdata_t IN)
                        {
                                v2f OUT;
                                OUT.vertex = mul(UNITY_MATRIX_MVP, IN.vertex);
                                OUT.texcoord = TRANSFORM_TEX(IN.texcoord, _MainTex);
                                OUT.texcoord1 = TRANSFORM_TEX(IN.texcoord, _PatternTex);
#ifdef UNITY_HALF_TEXEL_OFFSET
                                OUT.vertex.xy += (_ScreenParams.zw-1.0)*float2(-1,1);
#endif
                                OUT.color = IN.color;
                                return OUT;
                        }

                        fixed4 frag(v2f IN) : SV_Target
                        {
                                half4 color =  (tex2D(_MainTex, IN.texcoord) * tex2D(_PatternTex, IN.texcoord1) + _LinearDodge)/(1 - _ColorDodge);
                                color.a= tex2D(_MainTex, IN.texcoord).a;
                                return color;
                        }
                ENDCG
                }
        }
}
 
Glow Asteroids Game
Happy Chair
Аватара пользователя
eonyanov
UNITрон
 
Сообщения: 298
Зарегистрирован: 22 авг 2014, 10:28


Вернуться в Shader Lab

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2