关于Unity中混合模式、Alpha测试、深度测试、通道遮罩、面剔除的使用----渲染通道通用指令(二)...

本文深入探讨了图形渲染中的关键概念和技术,包括混合模式、Alpha测试、深度测试等,并通过具体案例展示了这些技术的实际应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

混合模式

着色完成后,需要把颜色混合到帧缓冲区里面,涉及到源和目标。

1:在所有计算完成后,决定当前的计算结果输出到帧缓冲区时,如何混合源和目标,通常用来绘制半透明的物体;
2: Blend Off 关闭混合
3: Blend 源因子,目标因子: 配置并开启混合,产生的颜色和因子相乘,然后两个颜色相加
4: Blend 源因子,目标因子, 源因子A,目标因子A: 源因子与目标因子用户混合颜色值,源因子A,与目标因子A,用于混合alpha
5: BlendOp操作命令: 不是将颜色混合在一起,而是对他们进行操作,主要有:
Min, Max, Sub, RevSub
6:混合因子的类型:
One 使用源或目标色完全显示出来; OneMinusSrcColor 阶段值 * (1-源颜色的值)
Zero 删除源颜色或目标颜色; OneMinusSrcAlpha 阶段值 * (1-源颜色的Alpha值)
SrcColor 这个阶段的值*源颜色值; OneMinusDstColor 阶段值 * (1-目标颜色的值);
DstColor 这个阶段的值* 帧缓冲颜色值; OneMinusDstAlha 阶段值 * (1-目标颜色Alpha值)
DstAlpha这个阶段的值 * 帧缓冲源Alpha值 SrcAlpha这个阶段的值 * 源颜色Alpha值
6:一般放在放在Pass通道里面,不能放在cgprogram的begin和end里面

 


Alpha测试

1:Alpha测试: 阻止片元被写到屏幕的最后机会, 最终渲染出来的颜色计算出来后可通过透明度和最后一个固定值比较,如果通过测试则绘制次片元,否则丢弃此片元;
2: AlphaTest Off/On: 开启/关闭Alpha测试,默认是关闭的;
3:比较测试值的模式:
Greater >, GEqual >=, Less <, LEqual <=, Equal ==, NotEqual !=,
Always (永远渲染), Never(从不渲染);
4: AlphaTest 条件 [变量] / 常数, 一般放在放在Pass通道里面;

 

 

深度测试

1:为了使近距离的物体挡住远距离的物体,当片元写入到缓冲的时候,需要将片元的深度值与缓冲区的深度值进行比较,测试成功写入帧缓冲区;
2: ZWrite 深度写开关, 控制是否将深度Z的片元写入缓冲区中,如果不绘制透明物体设置为On, 否则的话设置为Off,默认为On;
3: ZTest 深度测试模式: 设置深度测试的执行方式,默认为LEqual,深度测试的模式:
Less <, Greater >, LEqual <= , GEqual >=, Equal ==, NotEqual !=, Always 总是绘制,关闭深度测试;
4: ZTest 条件
5: 一般放在放在Pass通道里面;

 


通道遮罩

1:通道遮罩可以是开发人员指定渲染结果输出的通道,而不是通常情况下的RGBA四个通道;
2:可选的是RGBA的任意组合以及0,如果为0意味着不会写入到任何通道;
3: ColorMask RG ... ColorMask 0

 

 

面剔除

1:通过不渲染背对摄像机的几何体的面来提高性能优化错误,所有的几何体都包含正面和反面
2: 面剔除操作,大多数都是封闭的物体,所以不需要绘制背面;
3: 面剔除操作:
Cull Back: 不绘制背对摄像机的面,默认项
Cull Front, 不绘制面向摄像机的面,
Cull Off, 关闭面剔除操作

 

 

混合模式案例

1.创建Unity工程目录

2.在resources文件夹下面创建shaders文件夹

3.打开shaders文件夹,创建一个用于顶点片元着色的shader,create---->shader---->unlit shader,重命名为BlendShader

4.打开BlendShader

第一步:先把第一行改成Shader "Custom/BlendShader",这样才能在编辑器里面显示这个shader

第二步:

Shader "Custom/BlendShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _Color ("Color", Color) = (1.0, 0.0, 0.0, 1.0)
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" "Queue"="Transparent+10" }//设置渲染通道为透明,这样就可以看见后面的物体了
        LOD 100
        

        Pass
        {
            Blend SrcAlpha OneMinusSrcAlpha//设置混合模式,SrcAlpha是源因子,OneMinusSrcAlpha是目标因子,产生的各个颜色和各个因子相乘,然后两个颜色相加

            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            fixed4 _Color;
            struct appdata
            float _Alpha;

            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

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

            sampler2D _MainTex;
            float4 _MainTex_ST;
            
            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 = tex2D(_MainTex, i.uv);
                fixed4 col = _Color;
                return col;
            }
            ENDCG        
        }
    }
}

5.创建一个sphere,创建一个cube,拉伸cube,变成一个大饼挡住sphere

6.创建一个材质BlendShader,设置它的shader为custom/BlendShader

7.修改材质球颜色为红色,拉透明度条到一半,透明度条在color里面的最后一栏,把材质球拖进cube

8.发现颜色变透明且可以看见后面的白球sphere

 

 

通道遮罩案例

1.在shaders里面创建一个create---->shader---->standard surface shader,重命名ColorMaskShader

2.创建一个材质ColorMask,设置它的shader为custom/ColorMaskShader

3.创建一个cube,把材质球ColorMask拖进cube

4.打开ColorMaskShader

Shader "Custom/ColorMaskShader" {

    SubShader {
        pass {
            ColorMask R//最多RGBA,这里只显示红色
            Color(1.0, 1.0, 1.0, 1.0)
        }
    }
    FallBack "Diffuse"
}

5.发现为ColorMask R的时候,cube只显示红色,ColorMask G的时候,cube只显示绿色,ColorMask B的时候,cube只显示蓝色。ColorMask RGBA的时候,cube显示白色。

 

<think>好的,我需要回答用户关于Unity渲染管线中三种主要测试方法及其原理的问题。用户提到的三种测试应该是模板测试(Stencil Test)、深度测试(Depth Test)和透明测试Alpha Test)。我需要结合提供的引用内容,特别是引用[2]、[5]中的信息,来构建回答。 首先,模板测试:根据引用[2],模板测试位于透明测试深度测试之间,比较参考值和模板缓冲区的值,决定片段是否通过。需要解释其原理和应用场景,比如遮挡剔除或特效制作。 接下来是深度测试:虽然引用中没有直接详细说明,但结合引用[5]提到的Early-Z优化和Overdraw,可以知道深度测试用于确定像素的可见性,避免被遮挡的像素渲染。需要提到Early-Z的作用及其失效的情况,如Alpha Test或透明混合时。 透明测试Alpha Test):引用[5]提到Alpha Test会导致Early-Z失效,因为它需要在像素着色器之后确定是否保留像素。需要解释其原理,比如使用阈值来裁剪像素,以及性能影响。 然后,需要确保按照用户的要求,行内数学公式用$...$,独立公式用$$...$$,但当前问题可能不涉及数学公式,所以可能不需要。不过如果有涉及方程或技术术语,可能需要适当使用格式。 接下来要生成相关问题,可能需要围绕这三种测试的应用、优化、影响性能的因素来提问。比如如何优化深度测试效率,模板测试的应用场景,以及Alpha Test的替代方案等。 检查引用内容是否有遗漏或错误,例如引用[5]详细说明了Alpha Test对Early-Z的影响,而引用[2]详细描述了模板测试的流程。需要确保信息准确,并正确标注引用来源,如引用[2]和[5]。 最后,确保回答结构清晰,分点解释每个测试的原理、作用及注意事项,并在末尾添加相关问题。同时,引用标识要自然地加在相关段落末尾,比如在提到Early-Z失效时引用[5],在模板测试部分引用[2]。</think>### Unity渲染管线中的三大测试方法与原理 在Unity渲染管线中,**模板测试(Stencil Test)、深度测试(Depth Test)和透明测试Alpha Test/Clip)** 是三种核心测试方法,它们共同决定像素是否最终被渲染到屏幕上。以下分别从原理、作用及注意事项进行说明: --- #### 1. 模板测试(Stencil Test) - **原理**: 模板测试位于透明测试之后、深度测试之前[^2]。其核心是通过比较预设的**参考值(Reference Value)**与**模板缓冲区(Stencil Buffer)**中的当前值,根据设定的比较条件(如等于、大于、掩码匹配等),决定片段(Fragment)是否通过测试。若通过,则更新模板缓冲区的值;否则丢弃该片段。 $$ \text{条件:} \quad \text{ReferenceValue} \quad \text{OP} \quad \text{StencilBufferValue} $$ 其中,OP为比较运算符(如`Equal`、`Less`)。 - **应用场景**: 用于实现遮挡特效(如镜子反射)、区域限制渲染(如角色血条仅显示在特定区域)。 - **注意事项**: 模板缓冲区的读写操作需手动配置,且需合理管理不同物体的渲染顺序。 --- #### 2. 深度测试(Depth Test) - **原理**: 深度测试通过比较片段的**深度值(Z值)**与**深度缓冲区(Depth Buffer)**中的值,判断片段是否被其他物体遮挡。若片段深度值更小(距离相机更近),则通过测试并更新深度缓冲区;否则丢弃。 - **优化技术(Early-Z)**: 现代GPU通过**Early-Z**提前执行深度测试,避免被遮挡像素执行复杂的像素着色器计算,从而减少Overdraw(重复绘制)。但以下操作会导致Early-Z失效[^5]: - 使用透明混合(Alpha Blend)或透明测试Alpha Test)。 - 手动修改深度值。 - 关闭深度写入(Depth Write)。 - **注意事项**: 渲染顺序需遵循**“不透明物体 → 透明物体”**,并优先渲染覆盖积大的物体(如地形)以最大化利用Early-Z优化。 --- #### 3. 透明测试Alpha Test/Clip) - **原理**: 透明测试在像素着色器中通过阈值判断片段的透明度(Alpha值)。若Alpha值低于设定阈值,则直接丢弃该片段(如树叶的镂空效果)。代码示例: ```glsl if (alpha < _Cutoff) discard; ``` - **性能影响**: 由于测试发生在像素着色器阶段,GPU无法提前(如Early-Z阶段)确定片段是否保留,导致深度测试优化失效,增加Overdraw和性能开销。 - **替代方案**: 尽量使用**透明度混合(Alpha Blend)**或**贴图遮罩**替代Alpha Test,尤其在移动端设备上需谨慎使用[^5]。 --- ### 总结与优化建议 1. **渲染顺序**: 按`Opaque → AlphaTest → AlphaBlend`顺序渲染,确保Early-Z最大化生效。 2. **模板与深度缓冲管理**: 避免频繁修改缓冲区配置,减少性能损耗。 3. **Alpha Test限制**: 在性能敏感场景中,优先使用其他透明方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值