|
|
|
|
|
|
float4 uvSplat01 : TEXCOORD0; // xy: splat0, zw: splat1 |
|
|
|
float4 uvSplat23 : TEXCOORD1; // xy: splat2, zw: splat3 |
|
|
|
float4 uvControlAndLM : TEXCOORD2; // xy: control, zw: lightmap |
|
|
|
|
|
|
|
#if _TERRAIN_NORMAL_MAP |
|
|
|
half4 normal : TEXCOORD3; // xyz: normal, w: viewDir.x |
|
|
|
half4 tangent : TEXCOORD4; // xyz: tangent, w: viewDir.y |
|
|
|
half4 binormal : TEXCOORD5; // xyz: binormal, w: viewDir.z |
|
|
|
#else |
|
|
|
#if _TERRAIN_NORMAL_MAP |
|
|
|
half3 tangent : TEXCOORD4; |
|
|
|
half3 binormal : TEXCOORD5; |
|
|
|
half3 viewDir : TEXCOORD4; |
|
|
|
|
|
|
|
half4 fogFactorAndVertexLight : TEXCOORD6; // x: fogFactor, yzw: vertex light |
|
|
|
float3 positionWS : TEXCOORD7; |
|
|
|
float4 shadowCoord : TEXCOORD8; |
|
|
|
|
|
|
input.positionWS = IN.positionWS; |
|
|
|
|
|
|
|
#ifdef _TERRAIN_NORMAL_MAP |
|
|
|
input.normalWS = TangentToWorldNormal(normalTS, IN.tangent, IN.binormal, IN.normal); |
|
|
|
half3 viewDir = half3(IN.normal.w, IN.tangent.w, IN.binormal.w); |
|
|
|
input.normalWS = TangentToWorldNormal(normalTS, IN.tangent.xyz, IN.binormal.xyz, IN.normal.xyz); |
|
|
|
input.normalWS = normalize(IN.normal); |
|
|
|
half3 viewDir = IN.viewDir; |
|
|
|
input.normalWS = FragmentNormalWS(IN.normal); |
|
|
|
input.viewDirectionWS = SafeNormalize(GetCameraPositionWS() - IN.positionWS); |
|
|
|
input.viewDirectionWS = FragmentViewDirWS(viewDir); |
|
|
|
#ifdef _SHADOWS_ENABLED |
|
|
|
input.shadowCoord = IN.shadowCoord; |
|
|
|
#else |
|
|
|
|
|
|
void SplatmapMix(VertexOutput IN, half4 defaultAlpha, out half4 splat_control, out half weight, out half4 mixedDiffuse, inout half3 mixedNormal) |
|
|
|
{ |
|
|
|
splat_control = SAMPLE_TEXTURE2D(_Control, sampler_Control, IN.uvControlAndLM.xy); |
|
|
|
weight = dot(splat_control, 1); |
|
|
|
weight = dot(splat_control, 1.0h); |
|
|
|
clip(weight == 0.0f ? -1 : 1); |
|
|
|
clip(weight == 0.0h ? -1.0h : 1.0h); |
|
|
|
splat_control /= (weight + 1e-3f); |
|
|
|
splat_control /= (weight + 1e-3h); |
|
|
|
mixedDiffuse = 0.0f; |
|
|
|
mixedDiffuse += splat_control.r * SAMPLE_TEXTURE2D(_Splat0, sampler_Splat0, IN.uvSplat01.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.r); |
|
|
|
mixedDiffuse += splat_control.g * SAMPLE_TEXTURE2D(_Splat1, sampler_Splat0, IN.uvSplat01.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.g); |
|
|
|
mixedDiffuse += splat_control.b * SAMPLE_TEXTURE2D(_Splat2, sampler_Splat0, IN.uvSplat23.xy) * half4(1.0, 1.0, 1.0, defaultAlpha.b); |
|
|
|
mixedDiffuse += splat_control.a * SAMPLE_TEXTURE2D(_Splat3, sampler_Splat0, IN.uvSplat23.zw) * half4(1.0, 1.0, 1.0, defaultAlpha.a); |
|
|
|
mixedDiffuse = 0.0h; |
|
|
|
mixedDiffuse += splat_control.r * SAMPLE_TEXTURE2D(_Splat0, sampler_Splat0, IN.uvSplat01.xy) * half4(1.0h, 1.0h, 1.0h, defaultAlpha.r); |
|
|
|
mixedDiffuse += splat_control.g * SAMPLE_TEXTURE2D(_Splat1, sampler_Splat0, IN.uvSplat01.zw) * half4(1.0h, 1.0h, 1.0h, defaultAlpha.g); |
|
|
|
mixedDiffuse += splat_control.b * SAMPLE_TEXTURE2D(_Splat2, sampler_Splat0, IN.uvSplat23.xy) * half4(1.0h, 1.0h, 1.0h, defaultAlpha.b); |
|
|
|
mixedDiffuse += splat_control.a * SAMPLE_TEXTURE2D(_Splat3, sampler_Splat0, IN.uvSplat23.zw) * half4(1.0h, 1.0h, 1.0h, defaultAlpha.a); |
|
|
|
|
|
|
|
#ifdef _TERRAIN_NORMAL_MAP |
|
|
|
half4 nrm = 0.0f; |
|
|
|
|
|
|
nrm += splat_control.a * SAMPLE_TEXTURE2D(_Normal3, sampler_Normal0, IN.uvSplat23.zw); |
|
|
|
mixedNormal = UnpackNormal(nrm); |
|
|
|
#else |
|
|
|
mixedNormal = half3(0, 0, 1); |
|
|
|
mixedNormal = half3(0.0h, 0.0h, 1.0h); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
#ifdef TERRAIN_SPLAT_ADDPASS |
|
|
|
ApplyFogColor(color.rgb, half3(0,0,0), fogCoord); |
|
|
|
#else |
|
|
|
ApplyFog(color.rgb, fogCoord); |
|
|
|
#endif |
|
|
|
#ifdef TERRAIN_SPLAT_ADDPASS |
|
|
|
ApplyFogColor(color.rgb, half3(0.0h, 0.0h, 0.0h), fogCoord); |
|
|
|
#else |
|
|
|
ApplyFog(color.rgb, fogCoord); |
|
|
|
#endif |
|
|
|
} |
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////// |
|
|
|
|
|
|
o.uvControlAndLM.xy = TRANSFORM_TEX(v.texcoord, _Control); |
|
|
|
o.uvControlAndLM.zw = v.texcoord1 * unity_LightmapST.xy + unity_LightmapST.zw; |
|
|
|
|
|
|
|
half3 viewDir = VertexViewDirWS(GetCameraPositionWS() - positionWS.xyz); |
|
|
|
|
|
|
|
OutputTangentToWorld(vertexTangent, v.normal, o.tangent, o.binormal, o.normal); |
|
|
|
OutputTangentToWorld(vertexTangent, v.normal, o.tangent.xyz, o.binormal.xyz, o.normal.xyz); |
|
|
|
|
|
|
|
o.normal.w = viewDir.x; |
|
|
|
o.tangent.w = viewDir.y; |
|
|
|
o.binormal.w = viewDir.z; |
|
|
|
o.viewDir = viewDir; |
|
|
|
#endif |
|
|
|
o.fogFactorAndVertexLight.x = ComputeFogFactor(clipPos.z); |
|
|
|
o.fogFactorAndVertexLight.yzw = VertexLighting(positionWS, o.normal); |
|
|
|
|
|
|
#ifdef _SHADOWS_ENABLED |
|
|
|
#if SHADOWS_SCREEN |
|
|
|
o.shadowCoord = ComputeShadowCoord(o.clipPos); |
|
|
|
#else |
|
|
|
o.shadowCoord = TransformWorldToShadowCoord(positionWS); |
|
|
|
#endif |
|
|
|
#if SHADOWS_SCREEN |
|
|
|
o.shadowCoord = ComputeShadowCoord(o.clipPos); |
|
|
|
#else |
|
|
|
o.shadowCoord = TransformWorldToShadowCoord(positionWS); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
return o; |
|
|
|
|
|
|
half3 albedo = mixedDiffuse.rgb; |
|
|
|
half smoothness = mixedDiffuse.a; |
|
|
|
half metallic = dot(splat_control, half4(_Metallic0, _Metallic1, _Metallic2, _Metallic3)); |
|
|
|
half3 specular = half3(0, 0, 0); |
|
|
|
half3 specular = half3(0.0h, 0.0h, 0.0h); |
|
|
|
half4 color = LightweightFragmentPBR(inputData, albedo, metallic, specular, smoothness, /* occlusion */ 1.0, /* emission */ half3(0, 0, 0), alpha); |
|
|
|
half4 color = LightweightFragmentPBR(inputData, albedo, metallic, specular, smoothness, /* occlusion */ 1.0h, /* emission */ half3(0.0h, 0.0h, 0.0h), alpha); |
|
|
|
return half4(color.rgb, 1); |
|
|
|
return half4(color.rgb, 1.0h); |
|
|
|
} |
|
|
|
|
|
|
|
#endif // LIGHTWEIGHT_PASS_LIT_TERRAIN_INCLUDED |