71 lines
2.0 KiB
Plaintext
71 lines
2.0 KiB
Plaintext
Shader "Custom/WireframeWhiteSurface" {
|
|
Properties {
|
|
_WireColor ("Wire Color", Color) = (0,0,0,1) // 线框黑色
|
|
_SurfaceColor ("Surface Color", Color) = (1,1,1,1) // 表面白色
|
|
_Thickness ("Thickness", Range(0, 0.5)) = 0.05
|
|
}
|
|
SubShader {
|
|
Tags { "RenderType"="Opaque" }
|
|
LOD 100
|
|
|
|
Pass {
|
|
CGPROGRAM
|
|
#pragma vertex vert
|
|
#pragma fragment frag
|
|
#pragma geometry geom
|
|
#include "UnityCG.cginc"
|
|
|
|
struct appdata {
|
|
float4 vertex : POSITION;
|
|
};
|
|
|
|
struct v2g {
|
|
float4 vertex : POSITION;
|
|
};
|
|
|
|
struct g2f {
|
|
float4 pos : SV_POSITION;
|
|
float3 bary : TEXCOORD0;
|
|
};
|
|
|
|
float _Thickness;
|
|
fixed4 _WireColor;
|
|
fixed4 _SurfaceColor;
|
|
|
|
v2g vert (appdata v) {
|
|
v2g o;
|
|
o.vertex = v.vertex;
|
|
return o;
|
|
}
|
|
|
|
[maxvertexcount(3)]
|
|
void geom(triangle v2g IN[3], inout TriangleStream<g2f> stream) {
|
|
g2f o;
|
|
o.bary = float3(1, 0, 0);
|
|
o.pos = UnityObjectToClipPos(IN[0].vertex);
|
|
stream.Append(o);
|
|
|
|
o.bary = float3(0, 1, 0);
|
|
o.pos = UnityObjectToClipPos(IN[1].vertex);
|
|
stream.Append(o);
|
|
|
|
o.bary = float3(0, 0, 1);
|
|
o.pos = UnityObjectToClipPos(IN[2].vertex);
|
|
stream.Append(o);
|
|
}
|
|
|
|
fixed4 frag (g2f i) : SV_Target {
|
|
// 计算边缘距离
|
|
float minBary = min(min(i.bary.x, i.bary.y), i.bary.z);
|
|
|
|
// 线框部分:黑色
|
|
if (minBary < _Thickness) {
|
|
return _WireColor;
|
|
}
|
|
// 表面部分:白色
|
|
return _SurfaceColor;
|
|
}
|
|
ENDCG
|
|
}
|
|
}
|
|
} |