关于Unity中混合模式、Alpha测试、深度测试、通道遮罩、面剔除的使用----渲染通道通用指令(二)
混合模式
着色完成后,需要把颜色混合到帧缓冲区里面,涉及到源和目标。
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显示白色。