力场着色器展开纹理不起作用

Force field shader unwrap texture not working

我忘记从某个地方得到这个着色器了,默认只对被击中的效果使用纯色。所以我试着修改它,让它也支持盾牌纹理。

Shader "TFTM/FX/Shield2" {
     Properties {
         _Position ("Collision", Vector) = (-1, -1, -1, -1)        
         _MaxDistance ("Effect Size", float) = 40        
         _ShieldColor ("Color (RGBA)", Color) = (0.7, 1, 1, 0)
         _EmissionColor ("Emission color (RGBA)", Color) = (0.7, 1, 1, 0.01)        
         _EffectTime ("Effect Time (ms)", float) = 0
         _MainTex ("Texture (RGB)", 2D) = "white" {}
     }

 SubShader {
     Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
     LOD 2000
     Cull Off

     CGPROGRAM
       #pragma surface surf Lambert vertex:vert alpha
       #pragma target 3.0

      struct Input {
          float customDist;
          float2 uv_MainTex;
       };

       sampler2D _MainTex;
       float4 _Position;          
       float _MaxDistance;          
       float4 _ShieldColor;
       float4 _EmissionColor;          
       float _EffectTime;

       float _Amount;

       void vert (inout appdata_full v, out Input o) {
           o.customDist = distance(_Position.xyz, v.vertex.xyz);
           o.uv_MainTex = v.texcoord;
       }

       void surf (Input IN, inout SurfaceOutput o) {
         o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;
         o.Emission = _EmissionColor;

         if(_EffectTime > 0)
         {
             if(IN.customDist < _MaxDistance){
                   o.Alpha = _EffectTime/500 - (IN.customDist / _MaxDistance) + _ShieldColor.a;
                   if(o.Alpha < _ShieldColor.a){
                       o.Alpha = _ShieldColor.a;
                   }
               }
               else {
                   o.Alpha = _ShieldColor.a;
               }
           }
           else{
               o.Alpha = o.Alpha = _ShieldColor.a;
           }
       }

       ENDCG
 } 
 Fallback "Transparent/Diffuse"
}

我这里用纹理替换了颜色

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;

但它不起作用,它显示为一种单一颜色,而不是周围的纹理。

问题出在 o.Aplha。在您发布的着色器中,surf returns Alpha 与纹理无关,因此您需要更改 surf 方法以根据纹理设置输出 Alpha。

可以这样做:

1) 替换

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;

// Read texture and set it to vector4
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;

2) 插入

o.Alpha *= c.a;

之后
else {
    o.Alpha = o.Alpha = _ShieldColor.a;
}

结果看起来像这样:

完整的结果着色器代码:

Shader "TFTM/FX/Shield2" {
    Properties {
        _Position("Collision", Vector) = (-1, -1, -1, -1)
        _MaxDistance("Effect Size", float) = 40
        _ShieldColor("Color (RGBA)", Color) = (0.7, 1, 1, 0)
        _EmissionColor("Emission color (RGBA)", Color) = (0.7, 1, 1, 0.01)
        _EffectTime("Effect Time (ms)", float) = 0
        _MainTex("Texture (RGB)", 2D) = "white" {}
    }

    SubShader {
        Tags { "Queue" = "Transparent" "RenderType" = "Transparent" }
        LOD 2000
        Cull Off

    CGPROGRAM
    #pragma surface surf Lambert vertex:vert alpha
    #pragma target 3.0

    struct Input {
        float customDist;
        float2 uv_MainTex;
    };

    sampler2D _MainTex;
    float4 _Position;
    float _MaxDistance;
    float4 _ShieldColor;
    float4 _EmissionColor;
    float _EffectTime;

    float _Amount;

    void vert(inout appdata_full v, out Input o) {
        o.customDist = distance(_Position.xyz, v.vertex.xyz);
        o.uv_MainTex = v.texcoord;
    }

    void surf(Input IN, inout SurfaceOutput o) {
        half4 c = tex2D(_MainTex, IN.uv_MainTex);
        o.Albedo = c.rgb;//_ShieldColor.rgb;
        o.Emission = _EmissionColor;

        if (_EffectTime > 0)
        {
            if (IN.customDist < _MaxDistance) {
                o.Alpha = _EffectTime / 500 - (IN.customDist / _MaxDistance) + _ShieldColor.a;
                if (o.Alpha < _ShieldColor.a) {
                    o.Alpha = _ShieldColor.a;
                }
            }
            else {
                o.Alpha = _ShieldColor.a;
            }
        }
        else {
            o.Alpha = o.Alpha = _ShieldColor.a;
        }
        o.Alpha *= c.a;
    }

    ENDCG
    }
    Fallback "Transparent/Diffuse"
}