效果图
代码
Shader "DC/Shader/ShaderDemo/XRay"
{
Properties
{
_MainTex ("Texture", 2D) = "white" {}
_RayCol("RayCol",Color)=(1,1,1,1)
_RimCol("RimCol",Color)=(1,1,1,1)
}
SubShader
{
Tags { "RenderType"="Opaque" "Queue"="Transparent" }
LOD 100
CGINCLUDE
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
float3 normal : NORMAL;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float4 worldPos : TEXCOORD1;
float3 worldNormal : NORMAL;
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed4 _RayCol;
fixed4 _RimCol;
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
o.worldPos = mul(unity_ObjectToWorld,v.vertex);
o.worldNormal = mul(unity_ObjectToWorld, v.normal);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
//diffuse + specular + rim light
// float3 lDir = normalize(UnityWorldSpaceLightDir(i.worldPos.xyz));
//lambert
// float diffuse = saturate(dot(i.worldNormal, lDir));
// float3 viewDir = normalize(_WorldSpaceCameraPos - i.worldPos.xyz);
float3 vDir = UnityWorldSpaceViewDir(i.worldPos.xyz);
//blinn phong
// float specular = pow(max(0,dot(i.worldNormal, normalize(vDir + lDir))),5);
float rim = saturate(dot(i.worldNormal, vDir));
// fixed3 rgb = _RayCol.rgb * (diffuse + specular);
// return fixed4(lerp(rgb,fixed3(0,0,0), rim), _RayCol.a);
// return fixed4(fixed3(0,0,1) * (1 - rim), _RayCol.a);
// return fixed4(0.5,0.5,0.5,1);
// return lerp(_RayCol, fixed4(0,0,0,0), rim);
return lerp(_RimCol, fixed4(0,0,0,0), rim);
}
fixed4 normalFrag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
return col;
}
ENDCG
// 正常pass
Pass
{
Blend SrcAlpha OneMinusSrcAlpha
// Blend SrcAlpha One
ZTest Less
// ZTest Greater
// ZTest Always
ZWrite On
CGPROGRAM
#pragma vertex vert
#pragma fragment normalFrag
ENDCG
}
// X-Ray pass
Pass
{
// Blend SrcAlpha OneMinusSrcAlpha
Blend SrcAlpha One
// ZTest Less
ZTest Greater
// ZTest Always
ZWrite Off
Cull Off
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
ENDCG
}
}
}