头发unity

Shader "Unlit/shader03"
{
    Properties
    {
        _BaseMap ("BaseMap", 2D) = "white" {}
        _NormalMap("NormalMap", 2D)="bump"{}
        _Shiness("Shiness",float)=10
        _BaseColor("Base Color",COLOR)=(1,1,1,1)
        _Roughness("Roughness",float)=0
        _ReflectMap("_ReflectMap",Cube)="white" {}
        _AnisoMap("AnisoMap",2D)= "white" {}
        _SpecColor1("SpecColor1",COLOR)=(1,1,1,1)
        _SpecShiness1("SpecShiness1",Range(0,1))=1
        _SpecNoise1("SpecNoise1",float)=1
        _SpecOffset1("SpecOffset1",float)=0
        _SpecColor2("SpecColor2 ",COLOR)=(1,1,1,1)
        _SpecShiness2("SpecShiness2",Range(0,1))=1
        _SpecNoise2("SpecNoise2",float)=1
        _SpecOffset2("SpecOffset2",float)=0
        
        _DireExpose("DireExpose",Range(0,10))=1
     
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {   
            Tags{"LightMode"="ForwardBase"}
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog
            #pragma multi_compile_fwdbase
            #include "UnityCG.cginc"
            #include "AutoLight.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
                float4 tangent:TANGENT;
                float3 normal:NORMAL;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 pos : SV_POSITION;
                float3 world_normal:TEXCOORD1;
                float3 world_tangent:TEXCOORD2;
                float3 world_binary:TEXCOORD3;
                float3 world_pos:TEXCOORD4;
                LIGHTING_COORDS(5,6)
            };
            
            sampler2D _BaseMap;
            float4 _BaseMap_ST;
            float _Shiness;
            float4 _LightColor0;
            float4 _BaseColor;
            sampler2D _NormalMap;
            float _Roughness;
            float _DireExpose;
            sampler2D _AnisoMap;
            float4 _AnisoMap_ST; 
            float4 _SpecColor1;
            float _SpecShiness1;
            float _SpecNoise1;
            float _SpecOffset1;
            samplerCUBE _ReflectMap;
            float4 _ReflectMap_HDR;
            float4 _SpecColor2;
            float _SpecShiness2;
            float _SpecNoise2;
            float _SpecOffset2;

          
            inline float3 ACES_ToneMapping(float3 x)
            {
                float a=2.51f;
                float b=0.03f;
                float c=2.43f;
                float d=0.59f;
                float e=0.14f;
                float3 encode_color=saturate((x*(a*x+b))/(x*(c*x+d)+e));
                return encode_color;
            
            }

            v2f vert (appdata v)
            {
                v2f o;
                o.pos = UnityObjectToClipPos(v.vertex);
                o.uv = v.texcoord*_BaseMap_ST.xy+_BaseMap_ST.zw; 
                o.world_pos=mul(unity_ObjectToWorld,v.vertex);
                o.world_normal=normalize(mul(float4(v.normal,0.0),unity_WorldToObject)).xyz;
                o.world_tangent=normalize(mul(unity_ObjectToWorld,float4(v.tangent.xyz,0.0f))).xyz;
                o.world_binary=normalize(cross(o.world_normal,o.world_tangent).xyz/v.tangent.w).xyz;      
                TRANSFER_VERTEX_TO_FRAGMENT(o);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                half4 base_color_gamma=tex2D(_BaseMap,i.uv);
                half3 base_color=pow(base_color_gamma,2.2).rgb*_BaseColor;
                half3 sepc_color=base_color.rgb;
                half3 normal_data=UnpackNormal(tex2D(_NormalMap,i.uv));
                half roughness =saturate(_Roughness);
                
             
              

                // Dir
                half3 view_dir=normalize(_WorldSpaceCameraPos.xyz-i.world_pos);
                half3 normal_dir=normalize(i.world_normal);
                half3 tangent_dir=normalize(i.world_tangent);
                half3 binary_dir=normalize(i.world_binary);
                float3x3 TBN=float3x3(tangent_dir,binary_dir,normal_dir);
                normal_dir=normalize(mul(normal_data.xyz,TBN));
                 
                //LightInfo
                half3 light_dir=normalize(_WorldSpaceLightPos0.xyz);
                half atten=LIGHT_ATTENUATION(i);

                //直接光漫反射
                half diff_term=max(0.0,dot(normal_dir,light_dir));
                half half_Lamert=diff_term/2+0.5;
                half3 common_color=diff_term*_LightColor0.xyz*atten*base_color.xyz;
                half3 diff_color=common_color;

                //直接光镜面反射

                half2 uv_aniso=i.uv*_AnisoMap_ST.xy+_AnisoMap_ST.zw;
                half aniso_noise=tex2D(_AnisoMap,uv_aniso).r-0.5;


                half3 half_dir=normalize(view_dir+light_dir);
                half  NdotH= dot(normal_dir,half_dir);
                half  TdotH= dot(half_dir,tangent_dir);

                half  NodtV=max(0.0,dot(view_dir,normal_dir));
                float aniso_atten=saturate(sqrt(max(0.0 ,half_Lamert/NodtV)))*atten;

                
                float3 sepc_color1=_SpecColor1.rgb+base_color;
                float3 aniso_offset1=normal_dir*(aniso_noise*_SpecNoise1+_SpecOffset1);
                float3 binormal_dir1=normalize(binary_dir+aniso_offset1);
                float BdotH1=dot(half_dir,binormal_dir1)/_SpecShiness1;
                float3 spec_term1=exp(-(TdotH*TdotH+BdotH1*BdotH1)/(1.0+NdotH));
                float3 final_sepc1=spec_term1*aniso_atten*sepc_color1*_LightColor0.xyz;


                float3 sepc_color2=_SpecColor2.rgb+base_color;
                float3 aniso_offset2=normal_dir*(aniso_noise*_SpecNoise2+_SpecOffset2);
                float3 binormal_dir2=normalize(binary_dir+aniso_offset2);
                float BdotH2=dot(half_dir,binormal_dir2)/_SpecShiness2;
                float3 spec_term2=exp(-(TdotH*TdotH+BdotH2*BdotH2)/(1.0+NdotH));
                float3 final_sepc2  =spec_term2*aniso_atten*sepc_color2*_LightColor0.xyz;

               // half  BdotH=

                half  smoothness=1-roughness;
                half  shiness=lerp(1,_Shiness,smoothness); 
                half  sepc_term=pow(max(0,NdotH),shiness);



                half3 direct_spec=spec_term1*_LightColor0.xyz*atten*sepc_color*_DireExpose;

           
                //间接光镜面反射
                half3  reflect_dir=reflect(-view_dir,normal_dir);
                roughness=(1.7-0.7*roughness)*roughness;
                float mip_level=roughness*6;
                half4 cube_color=texCUBElod(_ReflectMap,float4(reflect_dir,mip_level));
                half3 decode_hdr=DecodeHDR(cube_color,_ReflectMap_HDR);
                half3 env_specular=decode_hdr*half_Lamert*aniso_noise ;

                //float3  final_color=direct_spec+diff_color+env_specular;
                float3 final_color=final_sepc1+final_sepc2+diff_color +env_specular*0.1 ;
                final_color=ACES_ToneMapping(final_color);
                final_color=pow(final_color,1/2.2f);


                return half4(final_color  ,1.0);

            }
            ENDCG
        }
    }
      FallBack "Diffuse"
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值