- 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