您当前的位置: 首页 >  Jave.Lin unity

Unity Shader - 模板简单测试 - 实现镂空/遮罩、描边

Jave.Lin 发布时间:2019-07-08 19:46:53 ,浏览量:4

文章目录
  • 镂空/遮罩
    • 镂空
      • Masker shader:
      • 再看看Be Masked被镂空的shader:
      • 注意绘制顺序的问题
      • 运行效果
    • 遮罩
      • 看看Be Masked被遮罩的shader:
      • 运行效果
      • 看一下绘制顺序的问题
  • 描边
    • 描边思路
      • 整体效果
      • 运行效果
        • 描边有透视的
        • 描边无透视的
  • 便于理解模板缓存的伪代码
  • 上面的伪代码的验证的地方
  • Project
  • References
关于Unity的模板测试介绍,可查看之前翻译的一篇: Unity Shader - ShaderLab: Stencil 模板(缓存)

以下的例子实现方式有多种多样,这里为了做示例测试,制作其一一种。

镂空/遮罩 镂空
  • Masker:确定屏幕空间中,需要镂空的像素的位置,通常绘制对应形状的图元就好,将模板缓存值设置为1(ref 1,comp always(comp always是default值,可以不写,为了方便理解而写上),pass replace),不输入任何颜色(colormask 0)。
  • Be Masked:绘制实体对象,只要是模板缓存值为1的,我们都不绘制(ref 1,comp notequal,pass keep(pass keep是default值,可以不写,为了方便理解而写上))
Masker shader:
// jave.lin 2019.07.08
Shader "Test/MyStencilMasker" {
    Properties {
        _MainTex ("Texture", 2D) = "white" {}
        _Luma("Luma", Range(0, 3)) = 1
    }
    SubShader {
        Tags { "RenderType"="Opaque" "Queue"="Geometry-1" }
        Pass {
            ColorMask 0
            ZWrite off
            ZTest always
            Stencil {
                Ref 1
                Comp always // default
                Pass replace
            }
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"
            struct appdata {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };
            struct v2f {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            sampler2D _MainTex;
            float4 _MainTex_ST;
            fixed _Luma;
            v2f vert (appdata v) {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                return o;
            }
            fixed4 frag (v2f i) : SV_Target {
                fixed4 col = tex2D(_MainTex, i.uv);
                fixed luma = dot(col.xyz, 1);
                if (luma             
关注
打赏
1688896170
查看更多评论
0.0777s