看过大牛的一个场景切换的效果 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的物体,类似下面这种,从不同的面片中看到物体。
物体的脚本是这样的:
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
}
}
}
更深层次的研究,经过测试后再记录。
版权声明:本文为qq_27361571原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。