unity-shader之混合模式、面剔除、Alpha测试、深度测试、通道遮罩

混合模式

我们着色完成之后,需要把颜色的混合输出到帧缓冲区里面,这个时候就可能涉及到源与目标,比如说半透明,原来是一个颜色Alpha通道的意思是我这个目标能够透过多少,也就是说我们本来的颜色只有RGB是没有Alpha通道的,Alpha类似于描述叠加颜色的时候要怎么叠加过去,所以Alpha通道
又叫做透明度,一旦有了透明度,就涉及到了原颜色与目标颜色的混合
下图是混合命令。
在这里插入图片描述
注意:混合命令要放置在通道Pass里面
示例:
场景
在这里插入图片描述
代码:

Shader "Custom/Mix_Shader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
		_Color ("Color",Color) = (1.0,0.0,0.0,1.0)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue" = "Transparent+1"}
        LOD 100

        Pass
        {
			//修改混合颜色模式的地方是在这里,将Zero修改成其他的混合模式
			Blend Zero OneMinusSrcAlpha  //在未开启混合模式的时候,不管怎样修改透明度都没有反应
            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;
			fixed4 _Color;

            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
            {
                // sample the texture
                fixed4 col = _Color;
                return col;
            }
            ENDCG
        }
    }
}

开启混合模式之后
在这里插入图片描述

Alpha测试

可以通过AlphaTerst off/on 来进行开启或者关闭Alpha测试,默认是关闭的
此测试是阻止片元被写到屏幕中的最后的机会,决定最终渲染的颜色的透明度与一个设定的固定值进行比较,符合条件则通过测试,进行片元的绘制,反之则丢弃此片元

比较测试纸的模式

  1. Greater 是>
  2. GEqual 是>=
  3. Less 是 <
  4. LEqual 是 <=
  5. Equal ==
  6. NotEqual !=
  7. Always 永远渲染
  8. Never 永不渲染

在这里插入图片描述
想要开启或者关闭Alpha测试只需要在Pass通道里面,CGPROGRAM外面添加相应的代码即可(由于添加的代码并不是标准的CG语言,所以需要添加到外面)

面剔除

在这里插入图片描述
与Alpha测试的位置一样。

深度测试

在这里插入图片描述
深度测试与上一篇博客的渲染队列相似,这里不再说明,语法与前两者一样

通道遮罩

1.通道遮罩是开发冉渊指定渲染结果输出的通道,而不是正常情况下的RGBA四个通道
2.可选的是RGBA的任意组合以及0,如果为0意味着不会写入任何队列
3.ColorMask RG…ColorMask 0
用法

Shader "Custom/Pass_Shader"
{
    SubShader
    {
		Pass
		{
				ColorMask R
				Color(1.0,1.0,1.0,1.0)
			}

		
    }
    
}

场景:
在这里插入图片描述
使用并运行:
在这里插入图片描述
只输出一个通道值

UnityShader中,要在High-Level Shader Language (HLSL) 中启用深度测试,你需要在着色器脚本中设置`DepthTest`和`DepthWrite`标记。通常这会在顶点着色器(VS)和片段着色器(FS)中完成。以下是基本步骤: 1. **打开Unity项目**,定位到Shader文件,找到你要编辑的Material或Surface Shader。 2. **打开着色器脚本**,通常是`.hlsl`或`.cginc`文件。如果你使用的是Unity内置的Shader Graph,可以在`Properties`部分找到相关的输入节点。 3. **在顶点着色器**(Vertex shader)中添加以下行,启用深度测试: ```hlsl bool _EnableDepthTest; // 在Properties部分声明布尔属性 vertex_out VS_OUTPUT { ... }; VS_OUTPUT VS(float4 vertex : POSITION, float4 uv : TEXCOORD0, uint id : SV_VertexID) { ... VS_OUTPUT output; output.position = UnityObjectToClipPos(vertex); output.depth = depth; // 记录物体深度 output.enableDepthTest = _EnableDepthTest; // 设置深度测试标志 ... } ``` 4. **在片段着色器**(Fragment shader)中同样设置深度写入: ```hlsl bool _EnableDepthWrite; fixed4 frag(PS_INPUT input) : SV_Target { ... if (_EnableDepthWrite) // 如果深度写入开关打开,则保存深度值 output.Depth = input.depth; ... } ``` 5. **最后,在Unity编辑器内**,通过`Material」>「Render Settings」> 「Advanced」> `Shader Graph」或`Standard Render Pipeline」> `Graphics Pipeline」设置中,调整你的图形管道并启用`Depth Test`和`Depth Write`开关。 6. **在Shader程序行为上**,你可以通过`_EnableDepthTest`和`_EnableDepthWrite`这两个属性来控制着色器是否启用深度测试和写入。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值