其他分享
首页 > 其他分享> > 15.透明shader

15.透明shader

作者:互联网

首先透明的shader应该是最后渲染的,如果一开始就渲染有可能被场景中不透明的挡住。

shader:

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Custom/NormalMapShader-Frag"
{
    Properties
    {
        _Color("Color",Color) = (1,1,1,1)
        _MainTex("Main Tex",2D) = "white"{}
        //_Gloss("Gloss",Range(8,200)) = 10
        _Specular("Specular",Color) = (1,1,1,1)
        _NormalMap("NormalMap",2D) = "bump"{}   //bump 代表使用自身的法线
        _BumpScale("BumpScale",Float) = 1  //法线高度力度
        _AlphaScale("AlphaScale",Float) = 1 //透明度
    }
    SubShader
    {
        Tags{"Queue" = "Transparent" "IngnoreProjector" = "True" "RenderType" = "Transparent" }  //
        pass
        {
            Tags { "LightMode"="ForwardBase" }
            ZWrite Off  //深度写入关闭
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #include "Lighting.cginc"
            #pragma vertex vert
            #pragma fragment frag
            fixed4 _Color;
            sampler2D _MainTex;
            sampler2D _NormalMap;
            half _Gloss;
            fixed3 _Specular;
            float4 _MainTex_ST;
            float4 _NormalMap_ST;
            float _BumpScale;
            float _AlphaScale;
            struct a2v
            {
                float4 vertex:POSITION;
                //切线空间的确定是通过法线和切线来确定的
                float3 normal:NORMAL;
                float4 tangent:TANGENT;//tanget.w是用来确定切线空间坐标轴的方向的
                float2 texcoord:TEXCOORD;
            };
            struct v2f
            {
                float4 pos:SV_POSITION;
                fixed3 worldNormalDir:color;
                float4 worldVert:TEXCOORD1;
                float4 uv:TEXCOORD2;     //xy 用来存储MainTex的纹理坐标  zw用来存储NormalMap的纹理坐标
                float3 tangentSpaceLightDir:TEXCOORD0;  //切线空间下光的方向
            };
            v2f vert(a2v v) //这里参数的名字必须是v 因为在这个宏TANGENT_SPACE_ROTATION里会调用v里的法线和切线
            {
                v2f f;
                f.pos = UnityObjectToClipPos(v.vertex);//UnityObjectToClipPos(i.vertex);
                //o.worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                //o.worldNormalDir = UnityObjectToWorldNormal(i.normal);
                f.worldVert = mul(unity_ObjectToWorld, v.vertex);
                f.uv.xy = v.texcoord * _MainTex_ST.xy + _MainTex_ST.zw;
                f.uv.zw = v.texcoord * _NormalMap_ST.xy + _NormalMap_ST.zw;
                TANGENT_SPACE_ROTATION;//调用这个宏后会得到一个矩阵rotation 用来把模型空间下的方向转成切线空间下
                f.tangentSpaceLightDir = mul(rotation, ObjSpaceLightDir(v.vertex));
                return f;
            }
            //把所有跟法线方向有关的运算全都放在切线空间下
            float4 frag(v2f f):SV_TARGET
            {
                //fixed3 worldNormalDir = mul(i.normal,(float3x3)unity_WorldToObject);
                
                //使用法线贴图后不需要直接取模型的了
                //fixed3 normalDir = normalize(i.worldNormalDir);  //这个矩阵把一个方向从世界空间转换到模型空间  这样放在后面就是模型到世界了
                fixed4 normalColor = tex2D(_NormalMap,f.uv.zw);
                //(贴图类型被unity识别成NormalType后会被unity进行处理使用自己的方法会读取的不正确使用unity提供的UnpackNormal)
                fixed3 tangentSpaceNormalDir = UnpackNormal(normalColor);
                tangentSpaceNormalDir.xy = tangentSpaceNormalDir.xy * _BumpScale;   //模型原法线和法线贴图的轴应该是一样的不需要改变
                tangentSpaceNormalDir = normalize(tangentSpaceNormalDir);//normalize(normalColor.xyz * 2 - 1);//切线空间下的法线的方向
                //fixed3 lightDir = normalize(_WorldSpaceLightPos0.xyz);//对于每个顶点来说光的位置就是光的方向,因为光是平行的。
                fixed3 lightDir = normalize(f.tangentSpaceLightDir);
                fixed3 halfLambert = dot(tangentSpaceNormalDir,lightDir) * 0.5 + 0.5;  //半兰伯特光照公式 max(dot(normalDir,lightDir),0);
                fixed3 texColor = tex2D(_MainTex,f.uv) * _Color;
                fixed3 diffuse = _LightColor0.rgb * halfLambert * texColor;//取得漫反射的颜色
                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.rgb * texColor;//获取环境光
                
                //fixed3 reflectDir = normalize(reflect(-lightDir,normalDir));//反射光方向 
                //fixed3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.pos.xyz);//视野方向
                fixed3 viewDir = normalize(UnityWorldSpaceViewDir(f.worldVert.xyz));
                fixed3 halfDir = normalize(viewDir + lightDir);
                //fixed3 specular = _LightColor0.rgb * _Specular * pow(max(dot(tangentSpaceNormalDir, halfDir) , 0) , _Gloss);
                fixed3 tempColor = diffuse + ambient;
                return fixed4(tempColor,_AlphaScale);
            }  
            ENDCG
        }
    }
    //FallBack "Diffuse"
}

 

 

标签:normalize,透明,法线,15,MainTex,shader,fixed3,float4,NormalMap
来源: https://blog.csdn.net/qq_35179648/article/details/113835965