- Home /
 
Adding Outline to a Curved Shader
Hi, I got a problem when trying to add an outline(just like as a toon shader) to a curved shader with unity 5.
This one is the original curved shader which works fine.
 Shader "Custom/Curved" {
     Properties {
         _MainTex ("Base (RGB)", 2D) = "white" {}
         _QOffset ("Offset", Vector) = (0,0,0,0)
         _Brightness ("Brightness", Float) = 0.0
         _Dist ("Distance", Float) = 100.0
     }
     
     SubShader {
         Tags { "Queue" = "Transparent"}
         Pass
         {
             
             Blend SrcAlpha OneMinusSrcAlpha 
             CGPROGRAM
             #pragma vertex vert
             #pragma fragment frag
             #include "UnityCG.cginc"
             
             
 
             sampler2D _MainTex;
             float4 _QOffset;
             float _Dist;
             float _Brightness;
             
             struct v2f {
                 float4 pos : SV_POSITION;
                 float4 uv : TEXCOORD0;
                 float3 viewDir : TEXCOORD1;
                 fixed4 color : COLOR;
             };
 
             v2f vert (appdata_full v)
             {
                v2f o;
                UNITY_INITIALIZE_OUTPUT(v2f, o);
                float4 vPos = mul (UNITY_MATRIX_MV, v.vertex);
                float zOff = vPos.z/_Dist;
                vPos += _QOffset*zOff*zOff;
                o.pos = mul (UNITY_MATRIX_P, vPos);
                o.uv = v.texcoord;
                return o;
             }
             half4 frag (v2f i) : COLOR0
             {
                   half4 col = tex2D(_MainTex, i.uv.xy);
                   col *= UNITY_LIGHTMODEL_AMBIENT*_Brightness;
                 return col;
             }
             ENDCG
         }
     }
     
     FallBack "Diffuse"
 }
 
 
               And this one is the one I am trying to add an outline into it.
 Shader "Outlined/Silhouetted Diffuse" {
     Properties {
         _Color ("Main Color", Color) = (.5,.5,.5,1)
         _OutlineColor ("Outline Color", Color) = (0,0,0,1)
         _Outline ("Outline width", Range (0.0, 0.03)) = .005
         _MainTex ("Base (RGB)", 2D) = "white" { }
     }
  
 CGINCLUDE
 #include "UnityCG.cginc"
  
 struct appdata {
     float4 vertex : POSITION;
     float3 normal : NORMAL;
 };
  
 struct v2f {
     float4 pos : POSITION;
     float4 color : COLOR;
 };
  
 uniform float _Outline;
 uniform float4 _OutlineColor;
  
 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;
     return o;
 }
 ENDCG
  
     SubShader {
         Tags { "Queue" = "Transparent" }
  
         // note that a vertex shader is specified here but its using the one above
         Pass {
             Name "OUTLINE"
             Tags { "LightMode" = "Always" }
             Cull Off
             ZWrite Off
             ZTest Always
             ColorMask RGB // alpha not used
  
             // 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 "BASE"
             ZWrite On
             ZTest LEqual
             Blend SrcAlpha OneMinusSrcAlpha
             Material {
                 Diffuse [_Color]
                 Ambient [_Color]
             }
             Lighting On
             SetTexture [_MainTex] {
                 ConstantColor [_Color]
                 Combine texture * constant
             }
             SetTexture [_MainTex] {
                 Combine previous * primary DOUBLE
             }
         }
     }
  
     SubShader {
         Tags { "Queue" = "Transparent" }
  
         Pass {
             Name "OUTLINE"
             Tags { "LightMode" = "Always" }
             Cull Front
             ZWrite Off
             ZTest Always
             ColorMask RGB
  
             // 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 exclude_renderers gles xbox360 ps3
             ENDCG
             SetTexture [_MainTex] { combine primary }
         }
  
         Pass {
             Name "BASE"
             ZWrite On
             ZTest LEqual
             Blend SrcAlpha OneMinusSrcAlpha
             Material {
                 Diffuse [_Color]
                 Ambient [_Color]
             }
             Lighting On
             SetTexture [_MainTex] {
                 ConstantColor [_Color]
                 Combine texture * constant
             }
             SetTexture [_MainTex] {
                 Combine previous * primary DOUBLE
             }
         }
     }
  
     Fallback "Diffuse"
 }
 
              
               Comment
              
 
               
              And what problem do you have? You haven't asked a question...
Your answer
 
             Follow this Question
Related Questions
Shader Outline scale problem since U5 1 Answer
Weird shader thing 1 Answer
Problem with custom shader (ShaderLab + Cg) 1 Answer
3D Text - Stroke/Outline 4 Answers
Parse Error on OutlinedDiffuse Shader 0 Answers