【代码】Unity3D 透明shader实例

整理自“简单易懂的Unity5 Shader着色器入门教程”P40
其中// 代表有相较于前一个代码的修改,部分添加了相应备注,另外这里去掉了高光反射
前一个代码见:https://blog.csdn.net/qq_35096175/article/details/113487488

透明shader

Shader "Unlit/Alpha"
{
    properties{
        _Diffuse("Diffuse Color",Color)=(1,1,1,1)

        _MainTex("Main Tex",2D) = "white"{}   
        _TexColor("Tex Color",Color) = (1,1,1,1)  
 
    }
    subshader{
        Tags{"Queue" = "Transparent" "IngoreProjector" = "True" "RenderType" = "Transparent"}  
        //不能定义在pass中,因为需要对所有pass起作用;Queue队列是unity渲染模型的时候是有顺序的,如果是透明的物体是最后渲染
        //IngorProjector:忽略投影
        pass{
            Tags{"LightMode"="ForwardBase"}  

            ZWrite off  //深度写入关闭
            Blend SrcAlpha OneMinusSrcAlpha//混合参数
            CGPROGRAM

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

            fixed4 _Diffuse;

            sampler2D _MainTex;   
            float4 _MainTex_ST;  
            fixed4 _TexColor;   

            struct a2v {
                float4 vertex:POSITION;
                float3 normal:NORMAL;
                float4 texcoord:TEXCOORD0;    

            };

            struct v2f {
                float4 svPos:SV_POSITION;   
                float3 worldNormal:TEXCOORD0;  
                float4 worldVertex:TEXCOORD1;  
                float2 uv:TEXCOORD2;    
            };

            v2f vert(a2v v){
                v2f f;
                f.svPos = UnityObjectToClipPos(v.vertex);   
                f.worldNormal = UnityObjectToWorldNormal(v.normal); 
                f.worldVertex = UnityObjectToClipPos(v.vertex);   

                f.uv = v.texcoord.xy * _MainTex_ST.xy + _MainTex_ST.zw;   
                return f;
            }

            fixed4 frag (v2f f):SV_Target{
                fixed4 texColor = tex2D(_MainTex,f.uv.xy) * _TexColor;   //加入贴图的透明值
                
                //漫反射
                fixed3 normalDir = normalize(f.worldNormal);
                fixed3 lightDir =  normalize(WorldSpaceLightDir(f.worldVertex));   
               
                fixed3 diffuse = _LightColor0.rgb * _Diffuse.rgb * max(dot(normalDir,lightDir),0);   
            
                fixed3 tempColor = texColor.rgb + diffuse  + UNITY_LIGHTMODEL_AMBIENT.rgb * _TexColor.rgb;     //这里仅使用texColor.rgb
                return fixed4(tempColor, 0.5); //1.可以加入属性面板调节值(0-1) 2.可以直接使用贴图的透明值   _TexColor.a  3.结合1,2
            }

            ENDCG

        }
    }

    fallback "Diffuse"

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值