利用模板测试实现遮罩效果

作者:追风剑情 发布于:2017-8-4 17:15 分类:Shader

模板测试

参考 http://blog.csdn.net/u011047171/article/details/46928463

官方文档 https://docs.unity3d.com/Manual/SL-Stencil.html

示例: Unity5.5

一、创建Cube和Quad,如图

11111.png

二、挂上Shader,如图

222.png33333.png

以下是Shader代码


Shader "Custom/Stencil" {
	Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
	Tags { "RenderType"="Opaque" "Queue"="Geometry"}
		
        Pass {
	    //设置模板测试
	    Stencil{
		//参考值
		Ref 1
		//如果Ref值等于StenciBuffer值,则模板测试通过
		Comp Equal
	    }
		
            Material {
            	//漫反射颜色
                Diffuse [_Color]
                //环境光颜色
                Ambient [_Color]
                //亮度
                Shininess [_Shininess]
                //高光颜色
                Specular [_SpecColor]
                //自发光颜色
                Emission [_Emission]
            }
            //开启光照
            Lighting On
            //开启高光
            SeparateSpecular On
            //混合纹理
            SetTexture [_MainTex] {
            	//纹理混合模式参见: https://docs.unity3d.com/Manual/SL-SetTexture.html
            	//主纹理rgb * 光照颜色rgb 2倍亮度, 主纹理alpha * 光照颜色的alpha
                Combine texture * primary DOUBLE, texture * primary

                //Quad: 4倍亮度
                //Combine texture * primary Quad, texture * primary
            }
        }
    }
}



Shader "Custom/StencilMask" {
	Properties {
        _Color ("Main Color", Color) = (1,1,1,0)
        _SpecColor ("Spec Color", Color) = (1,1,1,1)
        _Emission ("Emmisive Color", Color) = (0,0,0,0)
        _Shininess ("Shininess", Range (0.01, 1)) = 0.7
        _MainTex ("Base (RGB)", 2D) = "white" {}
    }
    SubShader {
	Tags { "RenderType"="Opaque" "Queue"="Geometry-1"}
	
        Pass {
	   //关闭RGBA输出通道
	   ColorMask 0
	   //关闭深度写入
	   ZWrite Off
			
	   //设置模板测试
	   Stencil{
		//参考值
		Ref 1
		//总是通过
		Comp Always
		//模板测试和深度测试都成功后,用Ref值替换掉stencilBuffer值
	        Pass Replace
	    }
		
            Material {
            	//漫反射颜色
                Diffuse [_Color]
                //环境光颜色
                Ambient [_Color]
                //亮度
                Shininess [_Shininess]
                //高光颜色
                Specular [_SpecColor]
                //自发光颜色
                Emission [_Emission]
            }
            //开启光照
            Lighting On
            //开启高光
            SeparateSpecular On
            //混合纹理
            SetTexture [_MainTex] {
            	//纹理混合模式参见: https://docs.unity3d.com/Manual/SL-SetTexture.html
            	//主纹理rgb * 光照颜色rgb 2倍亮度, 主纹理alpha * 光照颜色的alpha
                Combine texture * primary DOUBLE, texture * primary

                //Quad: 4倍亮度
                //Combine texture * primary Quad, texture * primary
            }
        }
    }
}


三、预览效果,只有被Quad遮挡住的Cube部分会被渲染到屏幕上。

44444.png

标签: Shader

Powered by emlog  蜀ICP备18021003号   sitemap

川公网安备 51019002001593号