2016-10-01 70 views
0

所以我設法將這個着色器放在一起,它將呈現對象的輪廓並以某種透明度呈現對象的其餘部分。這裏是整個代碼:Unity3d着色器不會將alpha通道的顏色生效

Shader "Outlined/Outline with transperancy" { 
    Properties { 
     _OutlineColor ("Outline Color1", Color) = (0,0,0,1) 
     _Outline ("Outline width", Range (0.0, 0.3)) = .005 
     _MainTex ("Maintexture", 2D) = "white" {} 
     _Color("Main Color",Color) = (0,0,0,0) 
    } 

CGINCLUDE 
#include "UnityCG.cginc" 

struct appdata { 
    float4 vertex : POSITION; 
    float3 normal : NORMAL; 
}; 

struct v2f { 
    float4 pos : POSITION; 
    float4 color : COLOR; 

}; 
struct v2ft 

{ 

    float4 pos : SV_POSITION; 

    float2 uv : TEXCOORD0; 

}; 
uniform float _Outline; 
uniform float4 _OutlineColor; 
uniform float4 _Color; 
v2f vert(appdata v) { 
    // just make a copy of incoming vertex data but scaled according to normal direction 
    v2f o; 
    o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 

    float3 norm = mul ((float3x3)UNITY_MATRIX_IT_MV, v.normal); 
    float2 offset = TransformViewToProjection(norm.xy); 

    o.pos.xy += offset * o.pos.z * _Outline; 
    o.color = _OutlineColor; 
    o.color.w = _Color.w; 
    return o; 
} 
ENDCG 

    SubShader { 
    Tags{ "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent" } 
    LOD 200 
     Pass { 
      Name "BASE" 
      Cull Back 
      Blend Zero One 

      // uncomment this to hide inner details: 
      //Offset -8, -8 

      SetTexture [_OutlineColor] { 
       ConstantColor (0,0,0,0) 
       Combine constant 
      } 
     } 

     // note that a vertex shader is specified here but its using the one above 
     Pass { 
      Name "OUTLINE" 
      Tags { "LightMode" = "Always" } 
      Cull Front 

      // you can choose what kind of blending mode you want for the outline 
      //Blend SrcAlpha OneMinusSrcAlpha // Normal 
      Blend One One // Additive 
      //Blend One OneMinusDstColor // Soft Additive 
      //Blend DstColor Zero // Multiplicative 
      //Blend DstColor SrcColor // 2x Multiplicative 

CGPROGRAM 
#pragma vertex vert 
#pragma fragment frag 

half4 frag(v2f i) :COLOR { 
    return i.color; 
} 
ENDCG 
     } 
     Pass{ 
     Name "Transperancy" 
    CGPROGRAM 

      #pragma vertex vert 

      #pragma fragment frag 

      #pragma multi_compile_builtin 

      #pragma fragmentoption ARB_precision_hint_fastest 



      #include "UnityCG.cginc" 


      v2ft vert(appdata_base v) 

      { 

       v2ft o; 

       o.pos = mul(UNITY_MATRIX_MVP, v.vertex); 

       o.uv = v.texcoord.xy; 

       return o; 

      } 



      sampler2D _MainTex; 

      //float4 _Color; 



      fixed4 frag(v2ft i) : COLOR 

      { 

       fixed4 result = tex2D(_MainTex, i.uv) * _Color; 
       return result; 

      } 

    ENDCG 

} 

    } 

    Fallback "Diffuse" 
} 

這一切運作良好,除了在顏色的色調在最後一傳的主紋理阿爾法沒有任何效果可言。色調本身起作用。

回答

0

更換透明度通過使用以下:

 Pass{ 
    ZWrite On 
    Blend SrcAlpha OneMinusSrcAlpha 
    ColorMask RGB 
    Material{ 
    Diffuse[_Color] 
    Ambient[_Color] 
} 
Lighting On 
SetTexture[_MainTex]{ 
    Combine texture * primary DOUBLE, texture * primary 
} 
}