1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
| Pass { Tags { "LightMode" = "ForwardBase"} CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma multi_compile_fwdbase #include "UnityCG.cginc" #include "AutoLight.cginc"
struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; float3 normal:NORMAL; float4 tangent:TANGENT; };
struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; float3 normali_dir:TEXCOORD1; float3 tangent_dir:TEXCOORD2; float3 binormal_dir:TEXCOORD3; float3 pos_world:TEXCOORD4;
};
sampler2D _MainTex; float4 _MainTex_ST; sampler2D _AOMap; float4 _AOMap_ST; float4 _LightColor0; float _Shininess; float _SpecularIntensity; float4 _AmbientColor; sampler2D _SpecMask; float _SpecMask_ST; sampler2D _NormalMap; float4 _NormalMap_ST; float _NormalIntensity; float __AmbientIntensity;
float3 ACESFilm(float3 x) { float a = 2.51f; float b = 0.03f; float c = 2.43f; float d = 0.59f; float e = 0.14f; return saturate((x*(a*x + b)) / (x*(c*x + d) + e)); };
v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.normali_dir = normalize(mul(float4(v.normal,0.0),unity_WorldToObject).xyz); o.tangent_dir = normalize(mul(float4(v.tangent.xyz,0.0),unity_WorldToObject).xyz); o.binormal_dir = normalize(cross(o.normali_dir,o.tangent_dir))* v.tangent.w; o.pos_world = mul(unity_ObjectToWorld,v.vertex).xyz; o.uv = TRANSFORM_TEX(v.uv, _MainTex); return o; }
fixed4 frag (v2f i) : SV_Target { fixed4 col=fixed4(0,0,0,0); half3 AO = tex2D(_AOMap,i.uv).xyz; half3 spec_mask = tex2D(_SpecMask,i.uv).xyz; half4 normalmap = tex2D(_NormalMap,i.uv);
half3 view_dir = normalize(_WorldSpaceCameraPos.xyz - i.pos_world); half3 light_dir =normalize( _WorldSpaceLightPos0.xyz );
half3 normal_dir =normalize(i.normali_dir); half3 tangent_dir =normalize(i.tangent_dir)*_NormalIntensity; half3 binormal_dir =normalize(i.binormal_dir)*_NormalIntensity; half3 normal_data = UnpackNormal(normalmap); float3x3 TBN = float3x3(tangent_dir,binormal_dir,normal_dir); normal_dir =normalize(mul(normal_data,TBN)); half NotL = max(dot(normal_dir,light_dir),0); half3 diffuse = NotL*_LightColor0.xyz; half3 specular = pow(max(dot(reflect(-light_dir,normal_dir),view_dir),0),_Shininess)* _LightColor0.xyz*_SpecularIntensity*spec_mask; half3 ambient = _AmbientColor.xyz*__AmbientIntensity;
col.xyz += diffuse; col.xyz += specular; col.xyz += ambient;
col.xyz *=tex2D(_MainTex, i.uv).xyz; col.xyz *=AO; return col; } ENDCG }
|