vrtk 描边穿透效果

// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'

Shader "Outline_Extend" {
	Properties {
		//_Outline("Out line",range(0,0.2))=0.02
		_Thickness("Thickness",range(0,2))=0.01
		_Factor("Factor",range(0,2))=0.5
		_Factor2("Factor",range(0,2))=0.5
		_OutlineColor("OutlineColor",Color) = (1,0,0,0)
		[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest("ZTest", Int) = 4  //声明外部控制开关
	}
	SubShader {

	 Pass
        {
            Stencil
            {
                Ref 1
                Comp Always
                Pass Replace
                ZFail Replace
            }

            ColorMask 0
        }


		pass{
		Tags{"LightMode"="Always"}
		Cull Back
		ZWrite On
		ZTest [_ZTest]
		Stencil
            {
                Ref 0
                Comp Equal
            }
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		float _Thickness;
		float _Factor;
		float4 _OutlineColor;
		struct v2f {
			float4 pos:SV_POSITION;
		};
		
		v2f vert (appdata_full v) {
			v2f o;
			o.pos=UnityObjectToClipPos(v.vertex);

			float3 dir=normalize(v.vertex.xyz);
			float3 dir2=v.normal;
			dir=lerp(dir,dir2,_Factor);
			dir= mul ((float3x3)UNITY_MATRIX_IT_MV, dir);
			float2 offset = TransformViewToProjection(dir.xy);
			offset=normalize(offset);
			o.pos.xy += offset * o.pos.z *_Thickness;

			return o;
		}
		float4 frag(v2f i):COLOR
		{
			return _OutlineColor;
		}
		ENDCG
		}//end of pass .1
		pass{
		Tags{"LightMode"="Always"}
		Cull Front
		ZWrite On
		ZTest[_ZTest]
		Stencil
            {
                Ref 0
                Comp Equal
            }
		CGPROGRAM
		#pragma vertex vert
		#pragma fragment frag
		#include "UnityCG.cginc"
		float _Thickness;
		float _Factor2;
		float4 _OutlineColor;
		struct v2f {
			float4 pos:SV_POSITION;
		};

		v2f vert (appdata_full v) {//.2
			v2f o;
			o.pos=UnityObjectToClipPos(v.vertex);

			float3 dir=normalize(v.vertex.xyz);
			float3 dir2=v.normal;
			dir=lerp(dir,dir2,_Factor2);
			dir= mul ((float3x3)UNITY_MATRIX_IT_MV, dir);
			float2 offset = TransformViewToProjection(dir.xy);
			offset=normalize(offset);
			o.pos.xy += offset * o.pos.z *_Thickness;
			return o;
		}
		float4 frag(v2f i):COLOR
		{
			return _OutlineColor;
		}
		ENDCG
		}//end of pass .2
	} 
}


FR:徐海涛(hunk xu)
QQ技术群:386476712

猜你喜欢

转载自blog.csdn.net/qq_15267341/article/details/85449598