Unity Shader深度测试-透视xray
发表于2018-06-21
透视XRay效果常常用来显示被墙体及其它物体遮挡的物体的轮廓,下面就和大家介绍下透视xray的使用。
效果
思路
实现这个效果需要两个pass
1. 绘制被遮挡部分,即 深度测试 Greater ,且不写入 深度缓冲区(防止印象其他物体的深度对比),剩下的 xray效果就比较容易,同一 空间 下通过 点积 处理。
2. 正常绘制,即 深度测试 LEqual ,且写入 深度缓冲区(正常与其他物体遮挡)。
shader代码:
Shader "ITS/test/aaaa_XRay" { Properties { _MainTex("Base 2D", 2D) = "white" {} _XRayColor("XRay Color", Color) = (1,1,1,1) } SubShader { CGINCLUDE // 写法二,使用 CGINCLUDE 写好 顶点、片段 着色器,然后各个 Pass 中 使用 CGPROGRAM 指定需要用到的 顶点、片段 着色器 #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 } } }