ExportMeshAndBasemapByPositionIndex.cs 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4. namespace AmazingAssets.TerrainToMesh.Example
  5. {
  6. [RequireComponent(typeof(MeshFilter), typeof(MeshRenderer))]
  7. public class ExportMeshAndBasemapByPositionIndex : MonoBehaviour
  8. {
  9. public TerrainData terrainData;
  10. public int vertexCountHorizontal = 100;
  11. public int vertexCountVertical = 100;
  12. public int mapsResolution = 512;
  13. public bool exportHoles = false;
  14. int chunkCountHorizontal = 4;
  15. int chunkCountVertical = 4;
  16. [Header("Chunk count is 4x4")]
  17. [Range(0, 3)]
  18. public int positionX;
  19. [Range(0, 3)]
  20. public int positionY;
  21. void Start()
  22. {
  23. if (terrainData == null)
  24. return;
  25. //1. Export mesh from terrain by position///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  26. Mesh terrainMesh = terrainData.TerrainToMesh().ExportMesh(vertexCountHorizontal, vertexCountVertical, chunkCountHorizontal, chunkCountVertical, positionX, positionY, true, TerrainToMesh.Normal.CalculateFromMesh);
  27. GetComponent<MeshFilter>().sharedMesh = terrainMesh;
  28. //2. Export basemap textures by position///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  29. Texture2D diffuseTexture = terrainData.TerrainToMesh().ExportBasemapDiffuseTexture(mapsResolution, chunkCountHorizontal, chunkCountVertical, positionX, positionY, exportHoles, false); //alpha channel will contain holesmap
  30. Texture2D normalTexture = terrainData.TerrainToMesh().ExportBasemapNormalTexture(mapsResolution, chunkCountHorizontal, chunkCountVertical, positionX, positionY, false);
  31. Texture2D maskTexture = null; //Built-in RP terain does not use Maskmaps
  32. if(Utilities.GetCurrentRenderPipeline() != Utilities.RenderPipeline.Builtin)
  33. maskTexture = terrainData.TerrainToMesh().ExportBasemapMaskTexture(mapsResolution, chunkCountHorizontal, chunkCountVertical, positionX, positionY, false); //contains metallic(R), occlusion(G) and smoothness(A)
  34. string shaderName = Utilities.GetUnityDefaultShader(); //Default shader based on used render pipeline
  35. string mainTexturePropName = Utilities.GetMaterailPropMainTex();
  36. string bumpMapPropName = Utilities.GetMaterailPropBumpMap();
  37. string metallicSmoothnessPropName = Utilities.GetMaterailPropMetallicSmoothnessMap();
  38. //3. Create material and assign exported basemaps/////////////////////////////////////////////////////////////////////////////////////////////////
  39. Material material = new Material(Shader.Find(shaderName));
  40. InitializeMaterial(material);
  41. material.SetTexture(mainTexturePropName, diffuseTexture);
  42. if (normalTexture != null)
  43. {
  44. material.SetTexture(bumpMapPropName, normalTexture);
  45. material.EnableKeyword("_NORMALMAP");
  46. }
  47. if (maskTexture != null)
  48. {
  49. material.SetTexture(metallicSmoothnessPropName, maskTexture);
  50. material.EnableKeyword("_METALLICGLOSSMAP");
  51. }
  52. if (exportHoles)
  53. {
  54. SetupAlphaTest(material);
  55. }
  56. GetComponent<Renderer>().sharedMaterial = material;
  57. }
  58. void InitializeMaterial(Material material)
  59. {
  60. if (Utilities.GetCurrentRenderPipeline() == Utilities.RenderPipeline.HighDefinition)
  61. {
  62. if (material.HasProperty("_DistortionSrcBlend"))
  63. material.SetFloat("_DistortionSrcBlend", 1);
  64. if (material.HasProperty("_DistortionDstBlend"))
  65. material.SetFloat("_DistortionDstBlend", 1);
  66. if (material.HasProperty("_DistortionBlurSrcBlend"))
  67. material.SetFloat("_DistortionBlurSrcBlend", 1);
  68. if (material.HasProperty("_DistortionBlurDstBlend"))
  69. material.SetFloat("_DistortionBlurDstBlend", 1);
  70. if (material.HasProperty("_StencilWriteMask"))
  71. material.SetFloat("_StencilWriteMask", 6);
  72. if (material.HasProperty("_StencilRefGBuffer"))
  73. material.SetFloat("_StencilRefGBuffer", 10);
  74. if (material.HasProperty("_StencilWriteMaskGBuffer"))
  75. material.SetFloat("_StencilWriteMaskGBuffer", 14);
  76. if (material.HasProperty("_StencilRefDepth"))
  77. material.SetFloat("_StencilRefDepth", 8);
  78. if (material.HasProperty("_StencilRefMV"))
  79. material.SetFloat("_StencilRefMV", 40);
  80. if (material.HasProperty("_StencilWriteMaskMV"))
  81. material.SetFloat("_StencilWriteMaskMV", 40);
  82. if (material.HasProperty("_ZTestDepthEqualForOpaque"))
  83. material.SetFloat("_ZTestDepthEqualForOpaque", 3);
  84. if (material.HasProperty("_ZTestModeDistortion"))
  85. material.SetFloat("_ZTestModeDistortion", 4);
  86. material.EnableKeyword("_NORMALMAP_TANGENT_SPACE");
  87. }
  88. }
  89. void SetupAlphaTest(Material material)
  90. {
  91. material.EnableKeyword("_ALPHATEST_ON");
  92. material.renderQueue = (int)UnityEngine.Rendering.RenderQueue.AlphaTest;
  93. switch (Utilities.GetCurrentRenderPipeline())
  94. {
  95. case Utilities.RenderPipeline.Builtin:
  96. {
  97. if (material.HasProperty("_Mode"))
  98. material.SetFloat("_Mode", 1);
  99. }
  100. break;
  101. case Utilities.RenderPipeline.Universal:
  102. {
  103. if (material.HasProperty("_AlphaClip"))
  104. material.SetFloat("_AlphaClip", 1);
  105. }
  106. break;
  107. case Utilities.RenderPipeline.HighDefinition:
  108. {
  109. if (material.IsKeywordEnabled("_DISABLE_SSR_TRANSPARENT") == false)
  110. material.EnableKeyword("_DISABLE_SSR_TRANSPARENT");
  111. if (material.HasProperty("_AlphaCutoffEnable"))
  112. material.SetFloat("_AlphaCutoffEnable", 1);
  113. if (material.HasProperty("_ZTestGBuffer"))
  114. material.SetFloat("_ZTestGBuffer", 3);
  115. }
  116. break;
  117. default:
  118. break;
  119. }
  120. }
  121. }
  122. }