// Upgrade NOTE: replaced 'mul(UNITY_MATRIX_MVP,*)' with 'UnityObjectToClipPos(*)'
Shader "Mars/Mount"
{
Properties
{
_Color("Color",Color) = (1,1,1,1)
_Albedo("Albedo",2D) = "white"{}
_Normal("Normal",2D) = "white"{}
_AlbedoSecond("AlbedoSecond",2D) = "white"{}
_NormalSecond("NormalSecond",2D) = "white"{}
_FirstNormalScale("FirstScale",float) = 1.0
_NormalScale("Scale",float) = 1.0
}
SubShader
{
Tags{"Queue" = "Geometry"}
Pass
{
Tags{"LightMode" = "ForwardBase"}
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "Lighting.cginc"
#include "UnityCG.cginc"
fixed4 _Color;
sampler2D _Albedo;
float4 _Albedo_ST;
sampler2D _Normal;
float4 _Normal_ST;
sampler2D _AlbedoSecond;
float4 _AlbedoSecond_ST;
sampler2D _NormalSecond;
float4 _NormalSecond_ST;
float _NormalScale;
float _FirstNormalScale;
struct a2v
{
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
float3 normal : NORMAL;
float4 tangent : TANGENT;
//float4 texcoordSecond : TEXCOORD0;
//float3 nromalSecond : NORMAL0;
//float4 tangentSecond : TANGENT0;
};
struct v2f
{
float4 pos : SV_POSITION;
float4 uv : TEXCOORD0;
float3 lightDir: TEXCOORD1;
float4 uvSecond : TEXCOORD2;
UNITY_FOG_COORDS(3)
//float3 lightDirSecond: TEXCOORD4;
};
v2f vert(a2v v)
{
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
//uv 计算
o.uv.xy = v.texcoord.xy *_Albedo_ST.xy + _Albedo_ST.zw;
o.uv.zw = v.texcoord.xy * _Normal_ST.xy + _Normal_ST.zw;
o.uvSecond.xy = v.texcoord.xy *_AlbedoSecond_ST.xy + _AlbedoSecond_ST.zw;
o.uvSecond.zw = v.texcoord.xy * _NormalSecond_ST.xy + _NormalSecond_ST.zw;
TANGENT_SPACE_ROTATION;
//切线空间计算
fixed3 worldNormal = UnityObjectToWorldNormal(v.normal);
fixed3 worldTangent = UnityObjectToWorldDir(v.tangent.xyz);
fixed3 worldBinormal = cross(worldNormal, worldTangent) * v.tangent.w;
float3x3 worldToTangent = float3x3(worldTangent, worldBinormal, worldNormal);
o.lightDir = mul(worldToTangent, WorldSpaceLightDir(v.vertex));
UNITY_TRANSFER_FOG(o,o.pos);
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed3 tangentLightDir = normalize(i.lightDir);
//fixed3 tangentLightDirSecond = normalize(i.lightDirSecond);
fixed4 albedo = tex2D(_Albedo, i.uv);
fixed4 albedoSecond = tex2D(_AlbedoSecond, i.uvSecond);
//法线计算
fixed4 packedNormal = tex2D(_Normal, i.uv.zw);
fixed3 tangentNormal;
tangentNormal = UnpackNormal(packedNormal);
tangentNormal.xy*=_FirstNormalScale;
tangentNormal.z = sqrt(1.0 - saturate(dot(tangentNormal.xy, tangentNormal.xy)));
//第二套法线
fixed4 packedNormalSecond = tex2D(_NormalSecond, i.uvSecond.zw);
fixed3 tangentNormalSecond;
tangentNormalSecond = UnpackNormal(packedNormalSecond);
tangentNormalSecond.xy*=_NormalScale;
tangentNormalSecond.z = sqrt(1.0 - saturate(dot(tangentNormalSecond.xy, tangentNormalSecond.xy)));
fixed3 diff1 = albedo.rgb * max(0.3, dot(tangentNormal, tangentLightDir));
fixed3 diff2 = albedoSecond.rgb * max(0.3, dot(tangentNormalSecond, tangentLightDir));
fixed3 final = diff1 * diff2;
final= final * _LightColor0.rgb*2 * UNITY_LIGHTMODEL_AMBIENT.xyz + diff1;
UNITY_APPLY_FOG(i.fogCoord, final);
return fixed4(final,1);
}
ENDCG
}
}
}
不知道是不是光照模型用的不一样还是写法有问题,导致和STANDARD的效果有一些差异,为了弥补无光照的地方特别暗的情况,计算的最小值用了0.3
max(0.3, dot(tangentNormal, tangentLightDir));