美文网首页
透明效果_双面渲染透明效果04

透明效果_双面渲染透明效果04

作者: Rayson | 来源:发表于2020-06-15 17:03 被阅读0次

    Shader代码:
    Shader中2个Pass代码一样,一个只渲染背面,一个只渲染正面
    Cull Front
    Cull Back

    Shader "Unity Shaders/Alpha_TestBothSided" {
    
        Properties {
    
            _Color ("Color Tint",Color)=(1,1,1,1)
            _MainTex ("Main tex",2D)="white"{}
            _Cutoff ("Alpha Cutoff",Range (0,1))=0.5 //控制 透明度测试时使用的判断条件
            
        }
        SubShader {
            Tags{"Queue"="AlphaTest" "IgonreProjector"="True" "RenderType"="TransparentCutout"}
    
            Pass {
                Tags {"LightMode"="ForwardBase"}
    
                Cull Front
                CGPROGRAM
    
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
    
                fixed4 _Color;
                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _Cutoff;
    
    
                // 应用>>>顶点
                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, 1.0);
                }
                ENDCG
            }
    
              Pass {
                Tags {"LightMode"="ForwardBase"}
                Cull Back
                
                CGPROGRAM
                
    
                #pragma vertex vert
                #pragma fragment frag
                #include "Lighting.cginc"
    
                fixed4 _Color;
                sampler2D _MainTex;
                float4 _MainTex_ST;
                fixed _Cutoff;
    
    
                // 应用>>>顶点
                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, 1.0);
                }
                ENDCG
            }
        }
        FallBack "Transparent/Cutout/VertexLit"
    }
    
    效果参考

    相关文章

      网友评论

          本文标题:透明效果_双面渲染透明效果04

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