Secondary maps shader

// 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));
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值