TerrainLitPasses_DR.hlsl 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #ifndef FLATKIT_TERRAIN_LIT_PASSES_DR_INCLUDED
  2. #define FLATKIT_TERRAIN_LIT_PASSES_DR_INCLUDED
  3. #include "Packages/com.unity.render-pipelines.universal/Shaders/Terrain/TerrainLitPasses.hlsl"
  4. #include "LibraryUrp/StylizedInput.hlsl"
  5. #ifdef TERRAIN_GBUFFER
  6. FragmentOutput SplatmapFragment_DSTRM(Varyings IN)
  7. #else
  8. half4 SplatmapFragment_DSTRM(Varyings IN) : SV_TARGET
  9. #endif
  10. {
  11. UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(IN);
  12. #ifdef _ALPHATEST_ON
  13. ClipHoles(IN.uvMainAndLM.xy);
  14. #endif
  15. half3 normalTS = half3(0.0h, 0.0h, 1.0h);
  16. #ifdef TERRAIN_SPLAT_BASEPASS
  17. half3 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uvMainAndLM.xy).rgb;
  18. half smoothness = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, IN.uvMainAndLM.xy).a;
  19. half metallic = SAMPLE_TEXTURE2D(_MetallicTex, sampler_MetallicTex, IN.uvMainAndLM.xy).r;
  20. half alpha = 1;
  21. half occlusion = 1;
  22. #else
  23. half4 hasMask = half4(_LayerHasMask0, _LayerHasMask1, _LayerHasMask2, _LayerHasMask3);
  24. half4 masks[4];
  25. ComputeMasks(masks, hasMask, IN);
  26. float2 splatUV = (IN.uvMainAndLM.xy * (_Control_TexelSize.zw - 1.0f) + 0.5f) * _Control_TexelSize.xy;
  27. half4 splatControl = SAMPLE_TEXTURE2D(_Control, sampler_Control, splatUV);
  28. #ifdef _TERRAIN_BLEND_HEIGHT
  29. // disable Height Based blend when there are more than 4 layers (multi-pass breaks the normalization)
  30. if (_NumLayersCount <= 4)
  31. HeightBasedSplatModify(splatControl, masks);
  32. #endif
  33. half weight;
  34. half4 mixedDiffuse;
  35. half4 defaultSmoothness;
  36. SplatmapMix(IN.uvMainAndLM, IN.uvSplat01, IN.uvSplat23, splatControl, weight, mixedDiffuse, defaultSmoothness, normalTS);
  37. half3 albedo = mixedDiffuse.rgb;
  38. half4 defaultMetallic = half4(_Metallic0, _Metallic1, _Metallic2, _Metallic3);
  39. half4 defaultOcclusion = half4(_MaskMapRemapScale0.g, _MaskMapRemapScale1.g, _MaskMapRemapScale2.g, _MaskMapRemapScale3.g) +
  40. half4(_MaskMapRemapOffset0.g, _MaskMapRemapOffset1.g, _MaskMapRemapOffset2.g, _MaskMapRemapOffset3.g);
  41. half4 maskSmoothness = half4(masks[0].a, masks[1].a, masks[2].a, masks[3].a);
  42. defaultSmoothness = lerp(defaultSmoothness, maskSmoothness, hasMask);
  43. half smoothness = dot(splatControl, defaultSmoothness);
  44. half4 maskMetallic = half4(masks[0].r, masks[1].r, masks[2].r, masks[3].r);
  45. defaultMetallic = lerp(defaultMetallic, maskMetallic, hasMask);
  46. half metallic = dot(splatControl, defaultMetallic);
  47. half4 maskOcclusion = half4(masks[0].g, masks[1].g, masks[2].g, masks[3].g);
  48. defaultOcclusion = lerp(defaultOcclusion, maskOcclusion, hasMask);
  49. half occlusion = dot(splatControl, defaultOcclusion);
  50. half alpha = weight;
  51. #endif
  52. InputData inputData;
  53. InitializeInputData(IN, normalTS, inputData);
  54. // If lightmap is enabled, flip the normal if the lightmap is flipped.
  55. /*
  56. #if defined(LIGHTMAP_ON)
  57. const half lightmapWorkaroundFlip = -1.0;
  58. inputData.normalWS = lightmapWorkaroundFlip * inputData.normalWS;
  59. #endif
  60. */
  61. #if UNITY_VERSION > 202340
  62. SETUP_DEBUG_TEXTURE_DATA_FOR_TEX(inputData, IN.uvMainAndLM.xy, _BaseMap);
  63. #elif VERSION_GREATER_EQUAL(12, 1)
  64. SETUP_DEBUG_TEXTURE_DATA(inputData, IN.uvMainAndLM.xy, _BaseMap);
  65. #endif
  66. #if defined(_DBUFFER)
  67. half3 specular = half3(0.0h, 0.0h, 0.0h);
  68. ApplyDecal(IN.clipPos,
  69. albedo,
  70. specular,
  71. inputData.normalWS,
  72. metallic,
  73. occlusion,
  74. smoothness);
  75. #endif
  76. #ifdef TERRAIN_GBUFFER
  77. BRDFData brdfData;
  78. InitializeBRDFData(albedo, metallic, /* specular */ half3(0.0h, 0.0h, 0.0h), smoothness, alpha, brdfData);
  79. half4 color;
  80. color.rgb = GlobalIllumination(brdfData, inputData.bakedGI, occlusion, inputData.normalWS, inputData.viewDirectionWS);
  81. color.a = alpha;
  82. SplatmapFinalColor(color, inputData.fogCoord);
  83. return BRDFDataToGbuffer(brdfData, inputData, smoothness, color.rgb);
  84. #else
  85. {
  86. _BaseColor.rgb *= albedo;
  87. #ifdef _CELPRIMARYMODE_SINGLE
  88. _ColorDim.rgb *= albedo;
  89. #endif
  90. #ifdef _CELPRIMARYMODE_STEPS
  91. _ColorDimSteps.rgb *= albedo;
  92. #endif
  93. #ifdef _CELPRIMARYMODE_CURVE
  94. _ColorDimCurve.rgb *= albedo;
  95. #endif
  96. #ifdef DR_CEL_EXTRA_ON
  97. _ColorDimExtra.rgb *= albedo;
  98. #endif
  99. #ifdef DR_GRADIENT_ON
  100. _ColorGradient.rgb *= albedo;
  101. #endif
  102. }
  103. SurfaceData surfaceData;
  104. surfaceData.albedo = albedo;
  105. surfaceData.alpha = alpha;
  106. surfaceData.emission = 0;
  107. surfaceData.specular = 0;
  108. surfaceData.smoothness = smoothness;
  109. surfaceData.metallic = metallic;
  110. surfaceData.occlusion = occlusion;
  111. surfaceData.normalTS = normalTS;
  112. surfaceData.clearCoatMask = 0;
  113. surfaceData.clearCoatSmoothness = 0;
  114. half4 color = UniversalFragment_DSTRM(inputData, surfaceData, IN.uvMainAndLM.xy);
  115. SplatmapFinalColor(color, inputData.fogCoord);
  116. return half4(color.rgb, 1.0h);
  117. #endif
  118. }
  119. #endif // FLATKIT_TERRAIN_LIT_PASSES_DR_INCLUDED