- Home /
 
Shader broke after update from 5.4 to 5.5
I checked the update guide and didn't find anything but i don't know much about shaders.
The problem right now is that the shader turns the object completely invisible instead of showing a colored outline.
http://wiki.unity3d.com/index.php/Silhouette-Outlined_Diffuse
 Shader "Outlined/Silhouette Only" {
     Properties {
         _OutlineColor ("Outline Color", Color) = (0,0,0,1)
         _Outline ("Outline width", Range (0.0, 0.03)) = .005
     }
  
 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" }
  
         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
         }
  
  
     }
  
     Fallback "Diffuse"
 
 
 }
 
              It's invisible now. If I disable front culling the entire object has the outline color. So i assume that the part that calculates the outline offset is somehow broken.
I see you're using a fixed function shader in the base pass - have you tried updating it with a basic vert/frag program ins$$anonymous$$d? (Never used fixed function shaders myself, but I know Aras has been trying to get rid of them)
Answer by tanoshimi · Dec 02, 2016 at 01:02 PM
Replace the fixed function shader by removing:
          SetTexture [_OutlineColor] {
              ConstantColor (0,0,0,0)
              Combine constant
          }
 
               and replacing with:
     CGPROGRAM
         #pragma vertex vert1
         #pragma fragment frag1
         v2f vert1(appdata v) {
             v2f o;
             o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
             return o;
         }
         half4 frag1(v2f i) :COLOR{
             return half4(1,1,1,1);
         }
     ENDCG
 
              Thanks for the reply, sadly I'm not seeing any change in behaviour. It's still invisible. Interestingly though, (this was the case before your changes as well) if i clip the camera through the object, it appears as if the inside/back faces of the mesh are colored with the outline color.
Really? Works for me. Perhaps the scale of your object is funky. What happens if you change _Outline ("Outline width", Range (0.0, 0.03)) = .005 to, say, _Outline ("Outline width", Range (0.0, 1)) = 1 and then really ramp up the outline width? 
That's interesting, it works now, with the lines being barely visible at maximum width. Though scaling is and was uniformly at 1,1,1 on every object and I didn't change anything besides upgrading from 5.4 to 5.5.
It does look as if the object was scaled, with the outline not connecting at the corners.
This is how it looks on a standard cube with the width all the way up: http://imgur.com/a/5ih5L
Answer by EdwinLyons · Feb 21, 2017 at 02:10 PM
You need to change this line:
 o.pos.xy += offset * o.pos.z * _Outline;
 
               to:
 #ifdef UNITY_Z_0_FAR_FROM_CLIPSPACE
     float z = UNITY_Z_0_FAR_FROM_CLIPSPACE(o.pos.z); 
 #else
     float z = o.pos.z;
 #endif
 o.pos.xy += offset * z * _Outline;
 
               This is due to the z depth being reversed on Unity 5.5.
Your answer
 
             Follow this Question
Related Questions
Dissolve Shader Problem 1 Answer
CRT shader but NOT for camera 0 Answers
Shader: Mask Without a Texture? 2 Answers