Unity Shader Example 11 (模板测试)

Box:

Shader "Custom/Box" {
	SubShader {
		//"Queue"="Geometry-1" ,先渲
        Tags { "RenderType"="Opaque" "Queue"="Geometry-1"}

        CGINCLUDE
            struct appdata {
                float4 vertex : POSITION;
            };
            struct v2f {
                float4 pos : SV_POSITION;
            };
            v2f vert(appdata v) {
                v2f o;
                o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                return o;
            }
            half4 frag(v2f i) : SV_Target {
                return half4(1,1,0,1);
            }
        ENDCG

        Pass {
				ColorMask 0
				ZWrite Off
	
				Stencil
				{
					Ref 1
					Comp Always
					Pass Replace
				}

				CGPROGRAM
				#pragma vertex vert
				#pragma fragment frag
				ENDCG
			}        
		} 
}


Model:


Shader "Custom/Model" {
	Properties {
	_MainTex ("Base (RGB)", 2D) = "white" {}
}

SubShader {
	//"Queue" = "Geometry" ,后渲
	Tags { "Queue" = "Geometry" "RenderType"="Opaque" }
	LOD 100

	Pass { 
	
		Stencil {
                Ref 1
      			Comp Equal
                } 
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			#pragma multi_compile_fog
			
			#include "UnityCG.cginc"

			struct appdata_t {
				float4 vertex : POSITION;
				float2 texcoord : TEXCOORD0;
				
			};

			struct v2f {
				float4 vertex : SV_POSITION;
				half2 texcoord : TEXCOORD0;
			
				UNITY_FOG_COORDS(1)
			};

			sampler2D _MainTex;
			float4 _MainTex_ST;
			
			v2f vert (appdata_t v)
			{
				v2f o;
				o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
				o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
								UNITY_TRANSFER_FOG(o,o.vertex);
				return o;
			}
			
			fixed4 frag (v2f i) : SV_Target
			{
				fixed4 col = tex2D(_MainTex, i.texcoord);
				UNITY_APPLY_FOG(i.fogCoord, col);
				UNITY_OPAQUE_ALPHA(col.a);
			
				return col;
			}
		ENDCG
	}
}

}

思路:

  1. ColorMask 0  
  2. ZWrite Off  
  3. Stencil{  
  4.     Ref 1  
  5.     Comp Always  
  6.     Pass Replace  
  7. }  
ColorMask 0
ZWrite Off
Stencil{
	Ref 1
	Comp Always
	Pass Replace
}


上面这段代码中,ColorMask 0作用是屏蔽颜色的输出,即不输出颜色到屏幕。ZWrite Off用来关闭深度写入,防止深度测试中后面的角色的像素被剔除掉;在stencil中 Ref 1将referenceValue设置成1,Comp Always 保证模板测试始终通过,Pass Replace 操作则将stencilBufferValue刷新为1;即这段代码的功能是在屏幕上对应模型的位置不输入任何颜色,而将对应位置的模板缓冲值刷新为1;



  1. Stencil {  
  2.       Ref 1  
  3.       Comp Equal  
  4. }  
Stencil {
      Ref 1
      Comp Equal
}

,

上面这段代码中,Ref 1将referenceValue设置成1,在接下来的一行代码中,Comp Equal的意思是,如果referenceValue=stencilBufferValue,则模板测试通过,渲染像素,否则抛弃;在这个例子中,由于屏幕中的像素默认的模板值(stencilBufferValue)为0(我猜的,貌似是正确的哈)而参考值referenceValue为1,,所以正常情况下使用这个shader的模型是不显示的,但是在使用了第一个shader的box区域,由于stencilBufferValue被刷新为1,所以在这个区域中,角色是能够显示的


参考:

UnityShader实例09:Stencil Buffer&Stencil Test  : http://blog.csdn.net/u011047171/article/details/46928463



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值