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"
}
头发unity
最新推荐文章于 2024-02-27 16:13:27 发布