美文网首页
透明效果_深度写入的半透明效果03

透明效果_深度写入的半透明效果03

作者: Rayson | 来源:发表于2020-06-15 16:42 被阅读0次
    Shader "Unity Shaders/Alpha Blending ZWrite" {
    
        Properties {
    
            _Color ("Color Tint",Color)=(1,1,1,1)
            _MainTex ("Main tex",2D)="white"{}
            _AlphaScale ("Alpha Scale",Range(0,1))=1                                //修改
            
        }
        SubShader {
            
            Tags{"Queue"="Transparent" "IgonreProjector"="True" "RenderType"="TransparentCutout"}  //修改 "Queue"="Transparent"\
    
    
            //增添部分 
            
            pass{
                
                ZWrite On           //把模型的深度信息写入深度缓冲中
                ColorMask 0         //该pass不写入颜色通道,即不输出颜色
            }
    
            Pass {
                Tags {"LightMode"="ForwardBase"}
    
                ZWrite Off                                                          //修改
                Blend SrcAlpha OneMinusSrcAlpha                                     //修改
    
                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
    
                fixed4 _Color;
                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _AlphaScale;                                                  //修改
    
    
                // 应用>>>顶点
                struct a2v{
    
                    float4 vertex : POSITION;
                    float3 normal :NORMAL;
                    float4 texcoord : TEXCOORD0;
                };
    
                // 顶点
                struct v2f{
    
                    float4 pos :SV_POSITION;
                    float3 worldNormal :TEXCOORD;
                    float3 worldPos :TEXCOORD1;
                    float2 uv : TEXCOORD2;
                };
    
                //模型-观察-投影
                v2f vert (a2v v)
                {
                    v2f o;
                    // 将顶点坐标从模型空间变换到裁剪空间
                    // 等价于o.pos = mul(UNITY_MATRIX_MVP, v.vertex);
                    o.pos = UnityObjectToClipPos(v.vertex);     
    
                    // 将法线从模型空间变换到时间空间
                    // 等价于o.worldNormal = normalize(mul(unity_ObjectToWorld, v.normal));
                    o.worldNormal = UnityObjectToWorldNormal(v.normal); 
    
                    // 将顶点坐标从模型空间变换到世界空间
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
    
                    //获取纹理
                    //o.uv = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);
                    
                    return o;
                }
    
    
                // 片元
                fixed4 frag( v2f i) : SV_Target {
    
                    
                    fixed3 worldNormal = normalize(i.worldNormal);
                     // 获得世界空间下光照方向
                    fixed3 worldLightDir = normalize(UnityWorldSpaceLightDir(i.worldPos));
    
                    fixed4 texColor = tex2D(_MainTex, i.uv);
    
                    // 透明度测试
                    //clip (texColor.a - _Cutoff);                                  //修改
    
                    // 主纹理颜色
                    fixed3 albedo = texColor.rgb * _Color.rgb;
                    // 环境光
                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
    
                     // 计算漫反射
                    // 兰伯特公式:Id = Ip * Kd * N * L
                    // IP:入射光的光颜色;
                    // Kd:漫反射系数 ( 0 ≤ Kd ≤ 1);
                    // N:单位法向量,
                    // L:单位光向量
                    fixed3 diffuse = _LightColor0.rgb * albedo * max(0, dot(worldNormal, worldLightDir));
    
                    
                    return fixed4(ambient + diffuse, texColor.a* _AlphaScale);      //修改    加入 texColor.a* _AlphaScale
                }
                ENDCG
            }
        }
        FallBack "Transparent/VertexLit"
    }
    
    效果

    相关文章

      网友评论

          本文标题:透明效果_深度写入的半透明效果03

          本文链接:https://www.haomeiwen.com/subject/hplhxktx.html