Unity: пользовательский шейдер не подчиняется альфа-каналу (прозрачности) - PullRequest
0 голосов
/ 04 мая 2020

Это настраиваемый шейдер в Unity, это трехцветный градиентный шейдер:

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "CustomShaders/ThreeColorsGradientShader" {
     Properties {
         [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
         _ColorTop ("Top Color", Color) = (1,1,1,1)
         _ColorMid ("Mid Color", Color) = (1,1,1,1)
         _ColorBot ("Bot Color", Color) = (1,1,1,1)
         _Middle ("Middle", Range(0.001, 0.999)) = 1

     }

     SubShader {
         Tags {"Queue"="Transparent"  "IgnoreProjector"="True"  "RenderType"="Transparent"}
         LOD 200

         ZWrite Off

         Pass {
         CGPROGRAM
         #pragma vertex vert  
         #pragma fragment frag
         #include "UnityCG.cginc"

         fixed4 _ColorTop;
         fixed4 _ColorMid;
         fixed4 _ColorBot;
         float  _Middle;

         struct v2f {
             float4 pos : SV_POSITION;
             float4 texcoord : TEXCOORD0;
         };

         v2f vert (appdata_full v) {
             v2f o;
             o.pos = UnityObjectToClipPos (v.vertex);
             o.texcoord = v.texcoord;
             return o;
         }

         fixed4 frag (v2f i) : COLOR {
             fixed4 c = lerp(_ColorBot, _ColorMid, i.texcoord.y / _Middle) * step(i.texcoord.y, _Middle);
             c += lerp(_ColorMid, _ColorTop, (i.texcoord.y - _Middle) / (1 - _Middle)) * (1 - step(i.texcoord.y, _Middle));
             //c.a = 1;
             return c;
         }
         ENDCG
         }
     }
 }

После назначения его материалу и использования материала в UIButton он работает должным образом, но если я хочу изменить цвет альфа материала (ie. сделать его прозрачным), он НЕ реагирует на эти изменения.

Чего не хватает в коде?

1 Ответ

0 голосов
/ 05 мая 2020

Изменить протестированную копию этого рекламного сообщения удалить ZWrite Off:

SubShader
{
     Tags {"Queue" = "Transparent" "RenderType" = "Transparent"}
     LOD 100
     Blend SrcAlpha OneMinusSrcAlpha

    Pass
    {

enter image description here

Изменить, чтобы применить к кнопке пользовательского интерфейса, снимите отметку с изображения с вашего компонента кнопки удалите спрайт, установите альфа-канал цвета равным 0. Добавьте плоскость в качестве дочернего элемента к объекту кнопки, измените размер плоскости так, как вы хотите, примените шейдер к плоскости.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...