Created
May 28, 2022 16:37
-
-
Save Fewes/1c37742289216aadf87e0ec5df838d2b to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Shader "Wireframe" | |
{ | |
Properties | |
{ | |
_Color ("Color", Color) = (1, 1, 1, 1) | |
_WireColor ("Wire Color", Color) = (0, 0, 0) | |
_Smoothing ("Smoothing", Range(0, 10)) = 1 | |
_Thickness ("Thickness", Range(0, 10)) = 1 | |
} | |
SubShader | |
{ | |
Pass | |
{ | |
CGPROGRAM | |
#pragma target 4.0 | |
#pragma vertex vert | |
#pragma fragment frag | |
#pragma geometry geo | |
#include "UnityCG.cginc" | |
float3 _Color; | |
float3 _WireColor; | |
float _Smoothing; | |
float _Thickness; | |
struct appdata | |
{ | |
float4 vertex : POSITION; | |
float3 normal : NORMAL; | |
}; | |
struct v2g | |
{ | |
float4 pos : SV_POSITION; | |
float4 uv : TEXCOORD0; | |
float3 normal : TEXCOORD1; | |
float3 worldPos : TEXCOORD2; | |
float2 bary : TEXCOORD3; | |
}; | |
v2g vert(appdata v) | |
{ | |
v2g o; | |
UNITY_INITIALIZE_OUTPUT(v2g, o); | |
o.pos = UnityObjectToClipPos(v.vertex); | |
o.worldPos = mul(unity_ObjectToWorld, v.vertex); | |
o.normal = UnityObjectToWorldNormal(v.normal); | |
return o; | |
} | |
struct g2f | |
{ | |
v2g data; | |
float2 bary : TEXCOORD4; | |
}; | |
[maxvertexcount(3)] | |
void geo(triangle v2g i[3], inout TriangleStream<g2f> stream) | |
{ | |
float3 p0 = i[0].worldPos.xyz; | |
float3 p1 = i[1].worldPos.xyz; | |
float3 p2 = i[2].worldPos.xyz; | |
float3 triangleNormal = normalize(cross(p1 - p0, p2 - p0)); | |
i[0].normal = triangleNormal; | |
i[1].normal = triangleNormal; | |
i[2].normal = triangleNormal; | |
g2f g0, g1, g2; | |
g0.data = i[0]; | |
g1.data = i[1]; | |
g2.data = i[2]; | |
g0.bary = float2(1, 0); | |
g1.bary = float2(0, 1); | |
g2.bary = float2(0, 0); | |
stream.Append(g0); | |
stream.Append(g1); | |
stream.Append(g2); | |
} | |
float4 frag(g2f i) : SV_Target | |
{ | |
float3 barys; | |
barys.xy = i.bary; | |
barys.z = 1 - barys.x - barys.y; | |
float3 deltas = fwidth(barys); | |
float3 smoothing = deltas * _Smoothing; | |
float3 thickness = deltas * _Thickness; | |
barys = smoothstep(thickness, thickness + smoothing, barys); | |
float minBary = min(barys.x, min(barys.y, barys.z)); | |
float3 color = lerp(_WireColor, _Color, minBary); | |
float3 viewNormal = mul((float3x3)UNITY_MATRIX_V, i.data.normal); | |
color *= dot(normalize(float3(0.5, 0.5, 1)), viewNormal) * 0.5 + 0.5; | |
return float4(color, 1); | |
} | |
ENDCG | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment