透視XRay效果常常用來顯示被墻體及其它物體遮擋的物體的輪廓洋腮,下面就和大家介紹下透視xray的使用漫蛔。
效果
思路
實現(xiàn)這個效果需要兩個pass
1. 繪制被遮擋部分间护,即 深度測試 Greater 掸茅,且不寫入 深度緩沖區(qū)(防止印象其他物體的深度對比)乡摹,剩下的 xray效果就比較容易状知,同一 空間 下通過 點(diǎn)積 處理。
2. 正常繪制堡纬,即 深度測試 LEqual 聂受,且寫入 深度緩沖區(qū)(正常與其他物體遮擋)。
shader代碼:
Shader "ITS/test/aaaa_XRay"
{
Properties
{
_MainTex("Base 2D", 2D) = "white" {}
_XRayColor("XRay Color", Color) = (1,1,1,1)
}
SubShader
{
CGINCLUDE // 寫法二烤镐,使用 CGINCLUDE 寫好 頂點(diǎn)蛋济、片段 著色器,然后各個 Pass 中 使用 CGPROGRAM 指定需要用到的 頂點(diǎn)炮叶、片段 著色器
#include "UnityCG.cginc"
fixed4 _XRayColor;
struct v2f
{
float4 pos : SV_POSITION;
float3 normal : NORMAL;
float3 viewDir : TEXCOORD0;
fixed4 clr : COLOR;
};
v2f vertXray(appdata_base v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.viewDir = ObjSpaceViewDir(v.vertex); // 在 模型空間 上計算夾角
o.normal = v.normal;
float3 normal = normalize(v.normal);
float3 viewDir = normalize(o.viewDir);
float rim = 1 - dot(normal, viewDir);
o.clr = _XRayColor * rim;
return o;
}
fixed4 fragXray(v2f i) : SV_TARGET
{
return i.clr;
}
sampler2D _MainTex;
float4 _MainTex_ST;
struct v2f2
{
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f2 vertNormal(appdata_base v)
{
v2f2 o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 fragNormal(v2f2 i) : SV_TARGET
{
return tex2D(_MainTex, i.uv);
}
ENDCG
Pass // xRay 繪制
{
Tags{ "RenderType"="Transparent" "Queue"="Transparent"}
Blend SrcAlpha One
ZTest Greater
ZWrite Off
Cull Back
CGPROGRAM
#pragma vertex vertXray
#pragma fragment fragXray
ENDCG
}
Pass // 正常繪制
{
Tags{ "RenderType"="Opaque" }
ZTest LEqual
ZWrite On
CGPROGRAM
#pragma vertex vertNormal
#pragma fragment fragNormal
ENDCG
}
}
}