123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- //
- // OutlineFill.shader
- // QuickOutline
- //
- // Created by Chris Nolet on 2/21/18.
- // Copyright © 2018 Chris Nolet. All rights reserved.
- //
- 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
- }
- }
- }
|