2017-01-04 39 views
5

Dostałem ten moduł cieniujący z czegoś, o czym zapomniałem, domyślnie używa się tylko jednolitego koloru dla efektu uderzenia. więc staram się go zmodyfikować, aby mógł również obsługiwać teksturę ekranu.Rozwijana tekstura modułu cieniującego nie dział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) { 
     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" 
} 

zastąpić kolor z fakturą tutaj

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

ale nie działa, pojawia się jako jeden kolor zamiast otaczającej go tekstury.

enter image description here enter image description here

+0

Czy zapewnione, że sfera ma poprawnych UV-współrzędne? Możesz na nie patrzeć na przykład z 'o.Albedo = float3 (IN.uv_MainTex.rg, 0.0)'. – Gnietschow

Odpowiedz

3

Problem jest z o.Aplha. W opublikowanym module cieniującym surf zwraca alfa bez względu na teksturę, więc musisz zmienić metodę surf, aby ustawić wyjściową alfa na podstawie tekstury.

Można to zrobić w ten sposób:

1) zastąpić

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

z

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

2) Włóż

o.Alpha *= c.a; 

po

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

Wynik wygląda smth takiego:

enter image description here

Kompletny kod wynikowy shader:

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