ExportMeshAndBasemap.cs 6.3 KB

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