Question by
kmsjkh · Nov 06, 2018 at 03:53 PM ·
shadershadersshader programmingoutline
why outline is drawed only on front side of skinned mesh render
i'm using quick outline asset(https://assetstore.unity.com/packages/tools/particles-effects/quick-outline-115488)
it works other mesh render , but on skinned mesh renderer , outline is drawed on only front side of character like image i i don't know why? is there anyone why this happen.....
[2]: /storage/temp/127314-20181107004649.png
20181107004649.png
(26.7 kB)
20181107004659.png
(35.6 kB)
Comment
Answer by kmsjkh · Nov 06, 2018 at 03:56 PM
Shader "Custom/Outline Fill" { Properties { [Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Float) = 0
_OutlineColor("Outline Color", Color) = (1, 1, 1, 1)
_OutlineWidth("Outline Width", Range(0, 10)) = 2
}
SubShader { Tags { "Queue" = "Transparent+110" "RenderType" = "Transparent" "DisableBatching" = "True" }
Pass {
Name "Fill"
Cull Off
ZTest [_ZTest]
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
ColorMask RGB
Stencil {
Ref 1
Comp NotEqual
}
CGPROGRAM
#include "UnityCG.cginc"
#pragma vertex vert
#pragma fragment frag
struct appdata {
float4 vertex : POSITION;
float3 normal : NORMAL;
float3 smoothNormal : TEXCOORD3;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f {
float4 position : SV_POSITION;
fixed4 color : COLOR;
UNITY_VERTEX_OUTPUT_STEREO
};
uniform fixed4 _OutlineColor;
uniform float _OutlineWidth;
v2f vert(appdata input) {
v2f output;
UNITY_SETUP_INSTANCE_ID(input);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(output);
float3 normal = any(input.smoothNormal) ? input.smoothNormal : input.normal;
float3 viewPosition = UnityObjectToViewPos(input.vertex);
float3 viewNormal = normalize(mul((float3x3)UNITY_MATRIX_IT_MV, normal));
output.position = UnityViewToClipPos(viewPosition + viewNormal * -viewPosition.z * _OutlineWidth / 1000.0);
output.color = _OutlineColor;
return output;
}
fixed4 frag(v2f input) : SV_Target {
return input.color;
}
ENDCG
}
} }