private static void SetupURPMaterial(int pass, DiggerSystem diggerSystem, List <Texture2D> textures) { var material = diggerSystem.Materials[pass]; var expectedShaderName = $"Digger/URP/Mesh-Pass{pass}"; if (!material || material.shader.name != expectedShaderName) { material = new Material(Shader.Find(expectedShaderName)); } var tData = diggerSystem.Terrain.terrainData; if (tData.terrainLayers.Length <= 4 && diggerSystem.Terrain.materialTemplate.IsKeywordEnabled("_TERRAIN_BLEND_HEIGHT")) { material.EnableKeyword("_TERRAIN_BLEND_HEIGHT"); material.SetFloat(EnableHeightBlend, 1); material.SetFloat(HeightTransition, diggerSystem.Terrain.materialTemplate.GetFloat("_HeightTransition")); } else { material.DisableKeyword("_TERRAIN_BLEND_HEIGHT"); material.SetFloat(EnableHeightBlend, 0); } var normalmap = false; var maskmap = false; var offset = pass * TxtCountPerPass; for (var i = 0; i + offset < tData.terrainLayers.Length && i < TxtCountPerPass; i++) { var terrainLayer = tData.terrainLayers[i + offset]; if (terrainLayer == null || terrainLayer.diffuseTexture == null) { continue; } if (terrainLayer.normalMapTexture) { normalmap = true; } if (terrainLayer.maskMapTexture) { maskmap = true; } var importer = (TextureImporter)TextureImporter.GetAtPath(AssetDatabase.GetAssetPath(terrainLayer.diffuseTexture)); material.SetFloat($"_NumLayersCount", tData.terrainLayers.Length); material.SetFloat($"_NormalScale{i}", terrainLayer.normalScale); material.SetFloat($"_Metallic{i}", terrainLayer.metallic); material.SetFloat($"_Smoothness{i}", importer && importer.DoesSourceTextureHaveAlpha() ? 1 : terrainLayer.smoothness); material.SetFloat($"_LayerHasMask{i}", terrainLayer.maskMapTexture ? 1 : 0); material.SetVector($"_DiffuseRemapScale{i}", terrainLayer.diffuseRemapMax - terrainLayer.diffuseRemapMin); material.SetVector($"_MaskMapRemapScale{i}", terrainLayer.maskMapRemapMax); material.SetVector($"_MaskMapRemapOffset{i}", terrainLayer.maskMapRemapMin); material.SetTexture(SplatPrefixProperty + i, terrainLayer.diffuseTexture); material.SetTexture(NormalPrefixProperty + i, terrainLayer.normalMapTexture); material.SetTexture(MaskPrefixProperty + i, terrainLayer.maskMapTexture); material.SetTextureScale(SplatPrefixProperty + i, new Vector2(1f / terrainLayer.tileSize.x, 1f / terrainLayer.tileSize.y)); material.SetTextureOffset(SplatPrefixProperty + i, terrainLayer.tileOffset); textures.Add(terrainLayer.diffuseTexture); } if (normalmap) { material.EnableKeyword("_NORMALMAP"); } else { material.DisableKeyword("_NORMALMAP"); } if (maskmap) { material.EnableKeyword("_MASKMAP"); } else { material.DisableKeyword("_MASKMAP"); } var matPath = Path.Combine(diggerSystem.BasePathData, $"meshMaterialPass{pass}.mat"); material = EditorUtils.CreateOrReplaceAsset(material, matPath); AssetDatabase.ImportAsset(matPath, ImportAssetOptions.ForceUpdate); diggerSystem.Materials[pass] = material; }