2017-01-04 8 views
5

나는 잊어 버린 어딘가에서이 쉐이더를 얻었습니다. 기본값은 적중되는 효과에 단색 만 사용하는 것입니다. 그래서 그것을 방패 텍스처를 지원하도록 수정하려고합니다.Force field shader unwrap texture가 작동하지 않습니다.

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;

하지만 제대로 작동하지 않으며 주변 텍스처 대신 단일 색상으로 나타납니다.

enter image description here enter image description here

+0

당신이 영역이 올바른 UV 좌표를 가지고, 보장나요? 예를 들어'o.Albedo = float3 (IN.uv_MainTex.rg, 0.0)'을 사용하여 볼 수 있습니다. – Gnietschow

답변

3

문제는 o.Aplha 함께. 발행 한 셰이더에서 surf은 텍스처에 관계없이 알파를 반환하므로 surf 메서드를 변경하여 텍스처를 기반으로 한 출력 알파를 설정해야합니다.

그것은이 방법으로 수행 할 수 있습니다

:

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

결과 후 0

는 다음과 같이 떨어지게 같습니다

enter image description here

전체 결과 쉐이더 코드 :

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