Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Force field shader unwrap texture not working

Tags:

unity3d

glsl

hlsl

I got this shader from somewhere which i forgot, the default is only use solid color for the effect being hit. so i try to modified it to make it support shield texture as well.

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"
}

I replace color with texture here

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

but it is not working, it appear as one single color instead of texture around it.

enter image description here enter image description here

like image 253
Tengku Fathullah Avatar asked Oct 17 '22 19:10

Tengku Fathullah


1 Answers

The problem is with o.Aplha. In the shader you published, surf returns Alpha regardless of texture, so you need to change surf method to set output Alpha based on texture.

It can be done this way:

1) Replace

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

with

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

2) Insert

o.Alpha *= c.a;

after

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

Result looks smth like this:

enter image description here

Complete result shader code:

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"
}
like image 175
user2890234 Avatar answered Oct 21 '22 08:10

user2890234