InTerra_TerrainLit_Basemap.hlsl 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. #define _TERRAIN_BASEMAP
  2. TEXTURE2D(_MainTex);
  3. TEXTURE2D(_MetallicTex);
  4. TEXTURE2D(_TriplanarTex);
  5. TEXTURE2D(_Triplanar_MetallicAO);
  6. SAMPLER(sampler_MainTex);
  7. SAMPLER(sampler_TriplanarTex);
  8. float4 _MainTex_ST;
  9. #include "InTerra_Functions.hlsl"
  10. void TriplanarBase(in out half4 baseMap, half4 front, half4 side, float3 weights, float2 splat, half firstToAllSteep)
  11. {
  12. baseMap = firstToAllSteep == 1 ? (baseMap * weights.y + front * weights.z + side * weights.x)
  13. : (baseMap * saturate(weights.y + (1 - splat.g))) + (((front * weights.z) + (side * weights.x)) * (splat.r));
  14. }
  15. void InTerraTerrainLitShade(float2 uv, inout TerrainLitSurfaceData surfaceData, float3 positionWS, float3 normalWS, float3 tangentViewDir)
  16. {
  17. float4 mainTex = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, uv);
  18. float4 metallic_AO_splat01 = SAMPLE_TEXTURE2D(_MetallicTex, sampler_MainTex, uv);
  19. float4 triplanarTex = SAMPLE_TEXTURE2D(_TriplanarTex, sampler_TriplanarTex, uv);
  20. #ifdef _TERRAIN_TRIPLANAR_ONE
  21. float3 weights = abs(normalWS);
  22. weights = pow(weights, _TriplanarSharpness);
  23. weights = weights / (weights.x + weights.y + weights.z);
  24. float3 flipUV = float3(1, 1, -1);
  25. float2 frontUV = TerrainFrontUV(positionWS, _MainTex_ST, uv, flipUV);
  26. float2 sideUV = TerrainSideUV(positionWS, _MainTex_ST, uv, flipUV);
  27. half4 cFront = SAMPLE_TEXTURE2D(_TriplanarTex, sampler_TriplanarTex, frontUV);
  28. half4 cSide = SAMPLE_TEXTURE2D(_TriplanarTex, sampler_TriplanarTex, sideUV);
  29. TriplanarBase(mainTex, cFront, cSide, weights, metallic_AO_splat01.b, _TriplanarOneToAllSteep);
  30. float3 tint = SAMPLE_TEXTURE2D(_TerrainColorTintTexture, SamplerState_Linear_Repeat, uv * _TerrainColorTintTexture_ST.xy + _TerrainColorTintTexture_ST.zw).rgb;
  31. mainTex.rgb = lerp(mainTex.rgb, ((mainTex.rgb) * (tint)), _TerrainColorTintStrenght).rgb;
  32. half4 mAoFront = SAMPLE_TEXTURE2D(_Triplanar_MetallicAO, sampler_TriplanarTex, frontUV);
  33. half4 mAoSide = SAMPLE_TEXTURE2D(_Triplanar_MetallicAO, sampler_TriplanarTex, sideUV);
  34. TriplanarBase(metallic_AO_splat01, mAoFront, mAoSide, weights, metallic_AO_splat01.b, _TriplanarOneToAllSteep);
  35. #endif
  36. surfaceData.albedo = mainTex.rgb;
  37. surfaceData.normalData = 0;
  38. surfaceData.smoothness = lerp(mainTex.a, 1.0f, _InTerra_GlobalWetness);
  39. surfaceData.metallic = metallic_AO_splat01.r;
  40. surfaceData.ao = metallic_AO_splat01.g;
  41. }
  42. void TerrainLitDebug(float2 uv, inout float3 baseColor)
  43. {
  44. #ifdef DEBUG_DISPLAY
  45. baseColor = GetTextureDataDebug(_DebugMipMapMode, uv, _MainTex, _MainTex_TexelSize, _MainTex_MipInfo, baseColor);
  46. #endif
  47. }