VirtualFramework/Assets/Shader/WireframeWhiteSurface.shader
2025-03-17 17:21:06 +08:00

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
}
}
}