[学习笔记]关于Stencil使用的学习

看过大牛的一个场景切换的效果 https://www.bilibili.com/video/av61096176/ ,非常震撼,打算实现一下。

 

关于Stencil的介绍,从另一个大牛文章中截取了一部分 :

Stencil {
Ref 2
Comp equal
Pass keep 
Fail decrWrap 
ZFail keep
}
下面一条一条来:
Ref referenceValue,这个是设定参考值,stencilbuffer里面的值会与他比较
ReadMask readMask,这个是在比较参考值和buffer值的时候用的,用于读取buffer值里面的值。
WriteMask writeMask,这个是写入buffer值用的。
Comp comparisonFunction,这个比较重要,这个是比较方式。大致有Greater,GEqual,Equal等八种比较方式,具体待会列图。
Pass stencilOperation,这个是当stencil测试和深度测试都通过的时候,进行的stencilOperation操作方法。注意是都通过的时候!
Fail stencilOperation,这个是在stencil测试通过的时候执行的stencilOperation方法。这里只要stencil测试通过就可以了
ZFail stencilOperation,这个是在stencil测试通过,但是深度测试没有通过的时候执行的stencilOperation方法。
 

目前能达到的效果大概就是透过Ref等于1的透明面片只能看到Ref为1的物体,类似下面这种,从不同的面片中看到物体。

[学习笔记]关于Stencil使用的学习_第1张图片

物体的脚本是这样的:

Shader "Stencils/Portal_1/Diffuse" {
Properties {
	_Color ("Main Color", Color) = (1,1,1,1)
	_MainTex ("Base (RGB)", 2D) = "white" {}
}
SubShader {
Stencil {
Ref 1
Comp equal
Pass keep
Fail keep
}
	Tags { "RenderType"="Opaque" }
	LOD 200

CGPROGRAM
#pragma surface surf Lambert

sampler2D _MainTex;
fixed4 _Color;

struct Input {
	float2 uv_MainTex;
};

void surf (Input IN, inout SurfaceOutput o) {
	fixed4 c = tex2D(_MainTex, IN.uv_MainTex) * _Color;
	o.Albedo = c.rgb;
	o.Alpha = c.a;
}
ENDCG
}

Fallback "VertexLit"
}

面片的脚本是这样的:

Shader "Stencils/Masks/StencilMask_1"
{
	SubShader 
	{
		Tags { "RenderType"="Opaque" "Queue"="Geometry-100"}
		ColorMask 0
		ZWrite off
		Stencil 
		{
			Ref 1
			Comp always
			Pass replace
		}
		
		Pass
		{
		CGPROGRAM
			#pragma vertex vert
			#pragma fragment frag
			
			struct appdata 
			{
				float4 vertex : POSITION;
			};
			
			struct v2f 
			{
				float4 pos : SV_POSITION;
			};
			
			v2f vert(appdata v) 
			{
				v2f o;
				o.pos = UnityObjectToClipPos(v.vertex);
				return o;
			}
			
			half4 frag(v2f i) : COLOR 
			{
				return half4(1,1,0,1);
			}
		ENDCG
		}
	}
}

更深层次的研究,经过测试后再记录。

你可能感兴趣的:([学习笔记]关于Stencil使用的学习)