Unity Shader案例04-------透明

Posted clf125800

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity Shader案例04-------透明相关的知识,希望对你有一定的参考价值。

Shader "CLF/SetTransparent"

    Properties
    
        _Diffuse("Diffuse",Color) = (1,1,1,1)  //  漫反射
        _MainTex("MainTex",2D) = "white"  //  2D纹理贴图
        _AlphaScale("Alpha Scale",Range(0,1)) = 1  //  控制Alpha参数
    
    SubShader
    
            Tags  "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "Transparent"    //  渲染顺序设置Transparent
            LOD 100
            //  用两个pass通道来处理,防止出现渲染错误,第一个pass通道  每个pass通道都会渲染一次
            Pass  
            
                ZWrite On  //  写入深度  为了确认渲染顺序
                ColorMask 0  //  掩码遮罩  代表这个pass通道不写入任何颜色值

            
            //  第二个pass通道
            Pass  
            
                Tags"LightMode" = "ForwardBase"

                ZWrite Off  //  关闭ZWrite(深度写入)
                Blend SrcAlpha OneMinusSrcAlpha  //  源颜色因子  正常透明混合

                CGPROGRAM
                #pragma vertex vert
                #pragma fragment frag
                #include "UnityCG.cginc"
                #include "Lighting.cginc"

                struct v2f 

                    float4 vertex :SV_POSITION;  //  输出顶点信息
                    fixed3 worldNormal : TEXCOORD0;
                    float3 worldPos:TEXCOORD1;
                    float2 uv:TEXCOORD2;

                ;

                fixed4 _Diffuse;
                float _AlphaScale;
                sampler2D _MainTex;
                float4 _MainTex_ST;  //  是MainTex的Tiling和Offset两个属性  不需要在外面定义

                v2f vert(appdata_base v)  //  顶点着色器
                

                    v2f o;  //  用这个结构体
                    o.vertex = UnityObjectToClipPos(v.vertex);  //  顶点信息从模型转到裁剪空间再放到输出结构体
                    fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);  //  法线从模型变换到世界坐标
                    o.worldNormal = worldNormal;
                    o.worldPos = mul(unity_ObjectToWorld, v.vertex);  //  顶点信息从模型转到世界坐标系
                    //o.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;  //  为了让MainTex的Tiling和Offset两个属性能影响到uv
                    o.uv = TRANSFORM_TEX(v.texcoord, _MainTex);  //  unity纹理函数,和上面效果一样
                    return o;
                

                fixed4 frag(v2f i) : SV_Target  //  片元着色器  片元高光反射
                

                    fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz;  //  环境光

                    fixed4 texColor = tex2D(_MainTex, i.uv);  //  采样这个图



                    //  漫反射
                    //fixed3 worldLightDir = normalize(_WorldSpaceLightPos0.xyz);
                    fixed3 worldLightDir = UnityWorldSpaceLightDir(i.worldPos);

                    fixed3 diffuse = texColor.rgb * _LightColor0.rgb * _Diffuse.rgb * max(0, dot(worldLightDir,i.worldNormal) * 0.5 + 0.5);  //  漫反射公式  图的纹理采样乘进来,纹理属于漫反射

                    fixed3 color = ambient + diffuse;
                    return fixed4(color, texColor.a * _AlphaScale);  //  texColor的a值就是颜色通道的值  乘上_AlphaScale来控制

                
                ENDCG
            
    
     FallBack "Transparent/VertexLit"

  

以上是关于Unity Shader案例04-------透明的主要内容,如果未能解决你的问题,请参考以下文章

浅墨Unity3D Shader编程之十三 单色透明Shader & 标准镜面高光Shader

Unity Shader ------ 透明效果之半透明效果的实现及原理

Unity透明视频/去除视频黑色shader

Unity Shader入门精要学习笔记 - 第8章 透明效果

Unity Shader 入门精要——双面渲染透明效果

Unity Shader 中各种Tag