Unity Shader unity文档学习笔记(十四):剔除 深度测试 透明度测试 透明度混合

写了这么久的shader发现自己还不会用这些标签
Cull Front
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
然后 又有东西可以学了 内卷王 哈哈

Cull 如果需要旋转还是关一下 默认是开启的背面剔除

剔除如果是不需要背面的话可以不管 就是摄像机看不到的那一面 会被剔除掉

ZWrite 深度写入 默认也是开启的

但做透明度的时候就需要关闭一下 不然做深度测试的时候发现 这个像素在前面一点 然后就覆盖了
这样的话就看不到 透明物体后面的东西了

然后讲一下透明度物体的一些处理吧:

1.透明度测试

clip(_Color.a - _Cutoff); 传入值为0时 剔除

2.透明度混合

需要关闭深度测试 默认打开这几个标签

 Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}

选择混合模式
Blend SrcAlpha OneMinusSrcAlpha 其中SrcAlpha 是源因子 OneMinusSrcAlpha是目标因子
最终得到的颜色是 源因子 * 源颜色 + 目标因子 * 目标颜色

Blend OneMinusDstAlpha One 柔和相加(Soft Addtive)
Blend DstColor Zero 正片叠底(Multiply),即相乘
Blend DstColor SrcColor 两倍相乘(2x Multiply)

BlendOp Min
Blend One One 变暗(Darken)

BlendOp Max
Blend One One 变亮(Lighten)

Blend OneMinusDstColor One 滤色(Screen)
Blend One One 线性减淡(Linear Dodge)

踩过的坑:Blend One OneMinusSrcAlpha
源因子用One的时候 不会计算alpha 透明通道变的很奇怪
不知道为什么 知道的大佬希望可以告诉一下我

如果只需要实现单面透明就写两个Pass
一个是用来做深度写入的 ZWrite On
一个用来透明度效果输出 ZWrite Off

如果需要一个模型的双面透明 也可以写两个Pass
可以不用开启深度写入了 但两个Pass内容是一样的
不过一个是剔除面向摄像机的 (这个要放前面 这样就能得到正确的深度关系
因为透明度渲染需要从从后往前渲染)

一个是剔除背面的
就能得到一个正确透明度的渲染模型了写了一个简单的shader
在这里插入图片描述

{
    Properties
    {
        _MainTex("MainTex", 2D) = "white" {}
        _Alpha ("Alpha", Range(0,1)) = 0
    }
    SubShader
    {
        Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
		
        Pass
        {
            Cull Front
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            float _Alpha;
            sampler2D _MainTex;
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
               return fixed4(tex2D(_MainTex, i.uv).rgb, _Alpha);
            }
            ENDCG
        }

        Pass
        {
            Cull Back
            ZWrite Off
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            float _Alpha;
            sampler2D _MainTex;
            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float4 vertex : SV_POSITION;
                float2 uv : TEXCOORD0;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                return fixed4(tex2D(_MainTex, i.uv).rgb, _Alpha);
            }
            ENDCG
        }
    }
}

猜你喜欢

转载自blog.csdn.net/qq_43204246/article/details/118033180
今日推荐