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