Unity Shader之Stencil Buffer

来源:互联网 发布:python字典转化 编辑:程序博客网 时间:2024/05/07 05:54

玩过纪念碑谷的人都知道里面有个很酷炫的效果,可以转动一个盒子看到盒子里面不同的建筑物,很好玩,自己做了个类似的效果。

核心是需要用到Stencil Buffer,这里是官方文档

https://docs.unity3d.com/Manual/SL-Stencil.html

这个功能主要是提供一个遮罩功能,可以由一个数值来决定丢弃或保存在缓冲里面颜色值。

注意,Stencil Buffer跟Depth Buffer不是一个Buffer,需要特定的显卡支持,还有另外有个ColorMask用到的Color Buffer也是单独的Buffer,不要搞混了。

很多高级应用会利用Depth Buffer和Stenci Buffer在图形渲染流水线中的关联关系,例如,Stencil的数值可以按每个像素是否通过Depth Test来自动增加或者减少。一些阴影渲染,轮廓渲染都是Stencil Buffer的高级用法。

注意执行顺序:片元------>裁剪------>透明测试-------->StencilTest----------->depth Test--------> Blender--------->颜色缓冲区。

以下是代码,首先是盒子表面

Shader "Custom/StencilMaskShader" {Properties {_StencilMask("Stencil Mask", Int) = 0}SubShader {Tags { "RenderType"="Opaque" "Queue"="Geometry-50" } //注意渲染顺序是先渲染此模板,再渲染要遮罩的物体ColorMask 0           //不会写入颜色值,此shader专门作为Stencil测试ZWrite OffStencil{Ref [_StencilMask]  //开启Stencil测试Comp  Always        //和Stencil缓冲区的值做比较,这里表示不管_StencelMask的大小,始终通过Pass Replace    //将_StencilMask值写入Stencil缓冲}Pass{CGPROGRAM#pragma vertex vert#pragma fragment fragstruct 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) :COLOR{return half4(0,0,0,1);}ENDCG}}}
物体的Shadr:
Shader "Custom/StencilGeometry" {Properties {_StencilMask("Stencil Mask",Int)=0_Color ("Color", Color) = (1,1,1,1)_MainTex ("Albedo (RGB)", 2D) = "white" {}_Glossiness ("Smoothness", Range(0,1)) = 0.5_Metallic ("Metallic", Range(0,1)) = 0.0}SubShader {Tags { "RenderType"="Opaque" }LOD 200Stencil{Ref[_StencilMask]Comp equal//和StencilBuffer中的值做比较看是否一样,不一样就丢弃该片元}CGPROGRAM// Physically based Standard lighting model, and enable shadows on all light types#pragma surface surf Standard fullforwardshadows// Use shader model 3.0 target, to get nicer looking lighting#pragma target 3.0sampler2D _MainTex;struct Input {float2 uv_MainTex;};half _Glossiness;half _Metallic;fixed4 _Color;void surf (Input IN, inout SurfaceOutputStandard o) {// Albedo comes from a texture tinted by colorfixed4 c = tex2D (_MainTex, IN.uv_MainTex) * _Color;o.Albedo = c.rgb;// Metallic and smoothness come from slider variableso.Metallic = _Metallic;o.Smoothness = _Glossiness;o.Alpha = c.a;}ENDCG}FallBack "Diffuse"}

 
原创粉丝点击