UnityShader学习教程之<透明度渲染队列详解>

Queue:渲染队列

渲染队列的值越小,渲染级别就越靠前,比如背景层就比如Background和Geometry显示的效果是Geometry在Background之上

值:Background背景层级别的渲染值为1000

Geometry几何体级别的渲染值为2000

AlphaTest 通道测试2450

Transparent 任何通道混合的对象使用该队列,带有透明效果的物体,玻璃或者粒子等3000

Overlay 镜头特效层4000

Zwrite off 重写对象的深度排序Zwrite On是指记录下当前渲染的物体的深度值,以便渲染的时候对深度进行排序,带有透明效果的物体应该开启深度测试,ZTest 某个阈值。

总结:如果想要自己控制渲染顺序,我们就应该关闭深度写入,打开深度测试,,当你关闭了这些,物体之间的渲染顺序会根据你在渲染队列标签设置的渲染

深度测试ZTest 的取值范围:Greater,GEqual,Less,LEqual,Equal,NotEqual,Always,Never,Off

颜色混合命令:Blend取值范围One,Zero,SrcColor,SrcAlpha,DisColor,DisAlpha,OneMinusSrcColor,OneMinusSrcAlpha,OneMinusDstColor,OneMinusDstAlpha

其中Src标签的表示源颜色,Dis标签的表示目标颜色,OneMinus表示对颜色取反

Shader "Unlit/任务10-1透明度渲染队列测试实体"
{
             Properties
             {
                  _MainTex ("Texture", 2D) = "white" {}
             }
             SubShader
                       {
                               Tags { "RenderType"="Opaque" "Queue" = "Geometry" }
                                LOD 200
                               Pass
                               {
                                             Cull Off
                                             CGPROGRAM
                                             #pragma vertex vert
                                             #pragma fragment frag
                                             #include "UnityCG.cginc"
                                             struct v2f
                                             {
                                                      float2 uv : TEXCOORD0;
                                                      float4 vertex : SV_POSITION;
                                              };
                                             sampler2D _MainTex;
                                             float4 _MainTex_ST;
                                             v2f vert (appdata_full v)
                                             {
                                                     v2f o;
                                                     o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                                     o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                                                     return o;
                                             }
                                             fixed4 frag (v2f i) : SV_Target
                                              {
                                                      fixed4 col = tex2D(_MainTex, i.uv);
                                                      return col;
                                              }
                                              ENDCG
                              }
               }
}

Shader "Unlit/任务10-2透明度渲染队列测试透明"
{
            Properties
            {
                        _MainTex ("Texture", 2D) = "white" {}
            }
            SubShader
            {
                      Tags { "RenderType"="Transparent" "Queue" = "Transparent" }
                      LOD 100
                      Pass
                      {  
                                Blend SrcAlpha OneMinusSrcAlpha
                                ZWrite Off//深度写入
                                ZTest Off //深度测试
                                Cull Off
                                CGPROGRAM
                                #pragma vertex vert
                                #pragma fragment frag
                                #include "UnityCG.cginc"
                                struct v2f
                                {
                                          float2 uv : TEXCOORD0;
                                          float4 vertex : SV_POSITION;
                                };
                                sampler2D _MainTex;
                                float4 _MainTex_ST;
                                v2f vert (appdata_full v)
                                {
                                           v2f o;
                                           o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                                           o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                                           return o;
                                 }
                                fixed4 frag (v2f i) : SV_Target
                                {
                                            float3 col = tex2D(_MainTex, i.uv).rgb;
                                            float4 color = float4(col,0.2);
                                            return color;
                                 }
                                ENDCG
               }
       }
}

一.当我们关闭透明度物体的深度写入和深度测试,打开透明的深度写入和深度测试原因是由于透明度物体没有写入深度,所有默认的渲染队列是2450,而实体的渲染队列是2000,透明度物体后渲染,所有显示效果就在实体前面了!这里透明效果的物体本来在实体的后面!!

二.当我们打开透明物体的深度写入和深度测试的时候:这里由于打开了深度测试和深度写入,按照相机的深度去渲染,而不是我们写入的队列,先渲染前面的,后渲染后面的,所有是这样的效果。

三.当我们关闭透明物体的深度写入,关闭深度测试的时候:

四.当我们打开透明物体的深度写入,打开深度测试的时候:

五.当我们没有写入深度的时候,深度测试也不会生效。

总结: 当我们关闭深度写入的时候,透明物体的前后会正常显示,当我们关闭深度写入打开深度测试的时候,透明物体的渲染队列会正常。当前都是在实体的深度写入和深度测试都是打开的时候。深度写入是指写入摄像机离物体的距离,也就是景深。

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值