遮挡透视 + 边缘光
Shader "Unlit/XRay"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {
}
_Diffuse ("Diffuse", Color) = (1, 1, 1, 1)
_XRayColor ("X Ray Color", Color) = (1, 0, 0, 1)
_XRayPow ("X Ray Pow", Float) = 1
}
SubShader
{
Tags {
"RenderType"="Opaque" "Queue" = "Geometry+1" }
LOD 100
// Pass1 : x ray
Pass
{
Blend SrcAlpha One
ZWrite off //防止 Pass2 不被渲染
ZTest Greater //使得在 此物体前面的对象剔除
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include <UnityCG.cginc>
#include <Lighting.cginc>
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
};
struct v2f
{
float4 pos : SV_POSITION;
float3 worldNormal : TEXCOORD0;
float3 viewDir : TEXCOORD1;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
float4 worldPos = mul(unity_ObjectToWorld, v.vertex);
o.viewDir = normalize(UnityWorldSpaceViewDir(worldPos));
o.worldNormal = UnityObjectToWorldNormal(v.normal);
return o;
}
fixed4 _XRayColor;
float _XRayPow;
fixed4 frag(v2f i) : SV_Target
{
float3 normal = normalize(i.worldNormal);
float3 viewDir = normalize(i.viewDir);
return _XRayColor * pow(1 - dot(normal, viewDir), _XRayPow);
}
ENDCG
}
// Pass2 : 正常渲染(包括光照)
Pass
{
Tags {
"LightMode" = "ForwardBase" }
CGPROGRAM
#pragma multi_compile_fwdbase
#pragma vertex vert
#pragma fragment frag
#include <UnityCG.cginc>
#include <UnityLightingCommon.cginc>
#include <Lighting.cginc>
#include <AutoLight.cginc>
struct a2v
{
float4 vertex : POSITION;
float3 normal : NORMAL;
float4 texcoord : TEXCOORD0;
};
struct v2f
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float4 worldPos : TEXCOORD1;
float3 worldNormal : TEXCOORD2;
SHADOW_COORDS(4)
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _Diffuse;
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.worldPos = mul(unity_ObjectToWorld, v.vertex);
o.worldNormal = UnityObjectToWorldNormal(v.normal);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 worldNormal = normalize(i.worldNormal);
float3 worldPos = i.worldPos;
fixed3 litDir = normalize(UnityWorldSpaceLightDir(worldPos));
fixed3 color = tex2D(_MainTex, i.uv).rgb * _Diffuse.rgb;
fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb;
fixed3 diffuse = _LightColor0.rgb * color * (dot(litDir, worldNormal) * 0.5 + 0.5);
UNITY_LIGHT_ATTENUATION(atten, i, worldPos);
return fixed4(diffuse * atten + ambient, 1.0);
}
ENDCG
}
}
}