// Custom shader to draw our toy cubes and balls with an outline around them. Shader "Custom/ToyCubeOutline" { Properties { _Color("Color", Color) = (1,1,1,1) _MainTex("Albedo", 2D) = "white" {} [PerRendererData] _OutlineColor ("Outline Color", Color) = (0,0,0,1) _OutlineWidth ("Outline width", Range (.002, 0.03)) = .005 [HideInInspector] _Mode ("__mode", Float) = 0.0 [HideInInspector] _SrcBlend ("__src", Float) = 1.0 [HideInInspector] _DstBlend ("__dst", Float) = 0.0 [HideInInspector] _ZWrite ("__zw", Float) = 1.0 } CGINCLUDE #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float3 normal : NORMAL; }; struct v2f { float4 pos : SV_POSITION; fixed4 color : COLOR; }; uniform float _OutlineWidth; uniform float4 _OutlineColor; uniform float4x4 _ObjectToWorldFixed; // Pushes the verts out a little from the object center. // Lets us give an outline to objects that all have normals facing away from the center. // If we can't assume that, we need to tweak the math of this shader. v2f vert(appdata v) { v2f o; // MTF TODO // 1. Fix batching so that it actually occurs. // 2. See if batching causes problems, // if it does fix this line by adding that component that sets it. //float4 objectCenterWorld = mul(_ObjectToWorldFixed, float4(0.0, 0.0, 0.0, 1.0)); float4 objectCenterWorld = mul(unity_ObjectToWorld, float4(0.0, 0.0, 0.0, 1.0)); float4 vertWorld = mul(unity_ObjectToWorld, v.vertex); float3 offsetDir = vertWorld.xyz - objectCenterWorld.xyz; offsetDir = normalize(offsetDir) * _OutlineWidth; o.pos = UnityWorldToClipPos(vertWorld+offsetDir); o.color = _OutlineColor; return o; } ENDCG SubShader { Tags { "Queue" = "Transparent" } Pass { Name "OUTLINE" // To allow the cube to render entirely on top of the outline. ZWrite Off Blend SrcAlpha OneMinusSrcAlpha CGPROGRAM #pragma vertex vert #pragma fragment frag fixed4 frag(v2f i) : SV_Target { // Just draw the _OutlineColor from the vert pass above. return i.color; } ENDCG } // Standard forward render. UsePass "Standard/FORWARD" } Fallback Off }