UV滚动+自定义光线高光+LightMap阴影贴图+法线贴图效果shader

Shader "Custom/FireRingUVShader" {
    Properties {
        _Color ("Color Tint", Color) = (1,1,1,1) //主颜色
        _MainTex ("Main Tex", 2D) = "white" {} //主贴图
        _LightMap ("Light Map", 2D) = "white" {} //阴影贴图
        _LightMapIntensity ("Light Map Intensity", Float) = 1.0 //阴影贴图强度
        _BumpMap("Normal Map", 2D) = "bump"{}  //法线贴图
        _BumpScale("Bumo Scale",Float) = 1.0 //凹凸感
        _Gloss("Gloss", Range(8.0,256)) = 20  //高光
        _Specular("Specular", Color) = (1,1,1,1) //高光颜色
        _LightDir("_LightDir",Vector) = (1,1,1,0) //光方向(世界坐标)
        _Light_Color("_Light_Color",Color) = (1,1,1,1) //光颜色
        _AnimSpeedX("_AnimSpeedX",Float) = 1.0 //uv滚动X轴速度
        _AnimSpeedY("_AnimSpeedY",Float) = 1.0 //uv滚动Y轴速度
    }
    SubShader{
        Pass{
            Tags {  "RenderType"="Opaque" "Queue" = "Geometry"}
            Blend SrcAlpha OneMinusSrcAlpha
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "Lighting.cginc"
            
            fixed4 _Color;
            sampler2D _MainTex;
            sampler2D _LightMap;
            float4 _MainTex_ST;
            sampler2D _BumpMap;
            float4 _BumpMap_ST;
            float _BumpScale;
            fixed4 _Specular;
            float _Gloss;
            float _LightMapIntensity;
            float3 _LightDir;
            fixed4 _Light_Color;
            float _AnimSpeedX;
            float _AnimSpeedY;

            struct a2v {
                float4 vertex : POSITION;
                float3 normal : NORMAL;
                float4 tangent : TANGENT;
                float4 texcoord0 : TEXCOORD0;
                float4 texcoord1 : TEXCOORD1;
            };

            struct v2f {
                float4 pos : SV_POSITION;
                float4 uv0 : TEXCOORD0;
                float3 uv1 : TEXCOORD1;
                float3 lightDir : TEXCOORD2;
                float3 viewDir : TEXCOORD3;
                
            };

            v2f vert(a2v v) {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                // uv 变量中 xy存储了_MainTex的纹理坐标, zw存储了_BumpMap的纹理坐标,分别对其进行赋值
                o.uv0.xy =  v.texcoord0.xy * _MainTex_ST.xy + _MainTex_ST.zw;
                o.uv0.zw =  v.texcoord0.xy * _BumpMap_ST.xy + _BumpMap_ST.zw;
                //滚动效果
                o.uv0.x += _AnimSpeedX* _Time.y; 
                o.uv0.y += _Time.y*_AnimSpeedY; 
                o.uv0.z += _AnimSpeedX* _Time.y;
                o.uv0.w += _Time.y*_AnimSpeedY; 
                o.uv1 = v.texcoord1;
                // 以下注释的两句话是通过手动来计算出模型空间到切线空间的变换矩阵rotation
                float3 binormal = cross(normalize(v.normal), normalize(v.tangent.xyz)) * v.tangent.w;   // 通过叉乘切线法线来确定y轴
                float3x3 rotation = float3x3(v.tangent.xyz, binormal, v.normal);    // 将其拼装成变换矩阵
                // 而宏命令TANGENT_SPACE_ROTATION则直接等于以上两句
                // TANGENT_SPACE_ROTATION;
                float3 _light_dir =  normalize(_LightDir.xyz);
                o.lightDir = mul(rotation, _light_dir).xyz;
                o.viewDir = mul(rotation, ObjSpaceViewDir(v.vertex)).xyz;
                return o;
            }

            fixed4 frag(v2f i) :SV_Target{
                // 归一化顶点着色器中得到的数据
                fixed3 tangentLightDir = normalize(i.lightDir);
                fixed3 tangentViewDir = normalize(i.viewDir);

                // 获取每个像素点的法线坐标
                fixed4 packedNormal = tex2D(_BumpMap, i.uv0.zw);
                fixed3 tangentNormal;
                // 如果纹理坐标没有被标记为normal map的话

                // 如果是normal map类型,使用自带的UnpackNormal方式
                #if defined(UNITY_NO_DXT5nm)
                    tangentNormal= packedNormal.xyz * 2 - 1;
                #else
                    packedNormal.x *= packedNormal.w;
                    fixed3 normal;
                    normal.xy = packedNormal.xy * 2 - 1;
                    normal.z = sqrt(1 - saturate(dot(normal.xy, normal.xy)));
                    tangentNormal = normal;
                #endif
                // tangentNormal = UnpackNormal(packedNormal);
                tangentNormal.xy *= _BumpScale;
                tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));
                // 计算反照率albedo,环境光ambient,漫反射光diffuse
                fixed3 albedo = tex2D(_MainTex, i.uv0).rgb*lerp((0,0,0,1),tex2D(_LightMap,i.uv1),_LightMapIntensity).rgb*_Light_Color.rgb;

                fixed3 ambient = UNITY_LIGHTMODEL_AMBIENT.xyz * albedo;
                fixed3 diffuse = _Light_Color.rgb * albedo * (dot(tangentNormal, tangentLightDir)*0.5 + 0.5);  //漫反射由法线和光线来决定
                // 计算高光specular,采用Blinn模型,计算出halfDir,即归一化的视线加光线
                fixed3 halfDir = normalize(tangentLightDir + tangentViewDir);
                fixed3 specular = _Light_Color.rgb * _Specular.rgb * pow(max(0, dot(tangentNormal, halfDir)), _Gloss);
                return fixed4((ambient + diffuse + specular)*_Color.rgb,_Color.a);
            }
            ENDCG
        }
    }
    FallBack "Specular"
}

最终效果:在这里插入图片描述
Cocos+u3d开发交流群:521643513

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值