Shader "VRTK/OutlineBasic"
|
|
{
|
|
Properties
|
|
{
|
|
_OutlineColor("Outline Color", Color) = (1, 0, 0, 1)
|
|
_Thickness("Thickness", float) = 1
|
|
}
|
|
|
|
SubShader
|
|
{
|
|
Tags
|
|
{
|
|
"Queue" = "Transparent"
|
|
"IgnoreProjector" = "True"
|
|
"RenderType" = "Transparent"
|
|
}
|
|
|
|
// Fill the stencil buffer
|
|
Pass
|
|
{
|
|
Stencil
|
|
{
|
|
Ref 1
|
|
Comp Always
|
|
Pass Replace
|
|
ZFail Replace
|
|
}
|
|
|
|
ColorMask 0
|
|
}
|
|
|
|
// Draw the outline
|
|
Pass
|
|
{
|
|
Blend SrcAlpha OneMinusSrcAlpha
|
|
ZWrite Off // On (default) = Ignore lights etc. Should this be a property?
|
|
Stencil
|
|
{
|
|
Ref 0
|
|
Comp Equal
|
|
}
|
|
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma geometry geom
|
|
#pragma fragment frag
|
|
|
|
#include "UnityCG.cginc"
|
|
half4 _OutlineColor;
|
|
float _Thickness;
|
|
|
|
struct appdata
|
|
{
|
|
float4 vertex : POSITION;
|
|
};
|
|
|
|
struct v2g
|
|
{
|
|
float4 pos : SV_POSITION;
|
|
};
|
|
|
|
v2g vert(appdata IN)
|
|
{
|
|
v2g OUT;
|
|
OUT.pos = UnityObjectToClipPos(IN.vertex);
|
|
return OUT;
|
|
}
|
|
|
|
void geom2(v2g start, v2g end, inout TriangleStream<v2g> triStream)
|
|
{
|
|
float width = _Thickness / 100;
|
|
float4 parallel = (end.pos - start.pos) * width;
|
|
float4 perpendicular = normalize(float4(parallel.y, -parallel.x, 0, 0)) * width;
|
|
float4 v1 = start.pos - parallel;
|
|
float4 v2 = end.pos + parallel;
|
|
v2g OUT;
|
|
OUT.pos = v1 - perpendicular;
|
|
triStream.Append(OUT);
|
|
OUT.pos = v1 + perpendicular;
|
|
triStream.Append(OUT);
|
|
OUT.pos = v2 - perpendicular;
|
|
triStream.Append(OUT);
|
|
OUT.pos = v2 + perpendicular;
|
|
triStream.Append(OUT);
|
|
}
|
|
|
|
[maxvertexcount(12)]
|
|
void geom(triangle v2g IN[3], inout TriangleStream<v2g> triStream)
|
|
{
|
|
geom2(IN[0], IN[1], triStream);
|
|
geom2(IN[1], IN[2], triStream);
|
|
geom2(IN[2], IN[0], triStream);
|
|
}
|
|
|
|
half4 frag(v2g IN) : COLOR
|
|
{
|
|
_OutlineColor.a = 1;
|
|
return _OutlineColor;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
FallBack "Diffuse"
|
|
}
|