XRay效果:
前后两个物体,透视长条带正常渲染,shader材质赋予胶囊体。
胶囊体中含有两个Pass,一个是透明的XRay效果,一个是正常渲染效果。
透明XRay效果深度测试ZTest为Greater,关闭深度写入。渲染时不透明物体从前往后渲染,先渲染长条带,写入深度。渲染胶囊体时先渲染第一个Pass,第一个Pass的ZTest为Greater,当前深度缓存深度小于胶囊体深度,深度测试通过,渲染透明XRay效果。第二个Pass的ZTest为默认LEqual,在未被遮挡部分,当前深度缓存为无穷大,深度测试通过,被遮挡部分深度缓冲为透明带深度,深度缓存小于胶囊体深度,测试不通过。
Shader "Custom/XRay"
{
Properties
{
_MainTex("Main Tex",2D) = "white"{}
_Color("Color",Color) = (1,1,1,1)
}
SubShader
{
CGINCLUDE
#include "UnityCG.cginc"
fixed4 _Color;
struct v2f
{
fixed4 pos : SV_POSITION;
fixed4 XColor : TEXCOORD0;
};
v2f vertexXRay(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
fixed3 viewDir = normalize(ObjSpaceViewDir(v.vertex));
fixed3 normal = normalize(v.normal);
fixed angle = abs(dot(viewDir,normal));
o.XColor = _Color * (1 - angle);
return o;
}
fixed4 fragmentXRay(v2f i) : SV_TARGET
{
return i.XColor;
}
sampler2D _MainTex;
fixed4 _MainTex_ST;
struct v2f2 {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f2 vertexNormal(appdata_base v)
{
v2f2 o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;
return o;
}
fixed4 fragmentNormal(v2f2 i) : SV_Target
{
fixed4 NColor = tex2D(_MainTex,i.uv);
return NColor;
}
ENDCG
Pass
{
Tags{"Queue" = "Transparent" "RenderType" = "Transparent"}
Blend SrcAlpha One
ZTest Greater
ZWrite Off
CGPROGRAM
#pragma vertex vertexXRay
#pragma fragment fragmentXRay
ENDCG
}
Pass
{
Tags{"Queue" = "Opaque" "RenderType" = "Opaque"}
ZTest LEqual
ZWrite On
CGPROGRAM
#pragma vertex vertexNormal
#pragma fragment fragmentNormal
ENDCG
}
}
}