12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576 |
- 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);
- //input.smoothNormal!=0?input.smoothNormal:input.normal
- 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
- }
- }
- }
|