private static void RenderToTexture(GrassColorMapRenderer renderer) { if (!renderer.renderCam) { Debug.LogError("Renderer does not have a render cam set up"); return; } bool isTerrain = false; //Get all terrains List <Terrain> terrains = new List <Terrain>(); foreach (GameObject item in renderer.terrainObjects) { if (item == null) { continue; } Terrain t = item.GetComponent <Terrain>(); if (t) { isTerrain = true; terrains.Add(t); } } if (isTerrain) { foreach (Terrain t in terrains) { t.drawTreesAndFoliage = false; } } //Temporarly move terrains up 1000 units if (renderer.terrainObjects != null || renderer.terrainObjects.Count != 0) { if (renderer.terrainObjects[0]) { originalTerrainHeight = renderer.terrainObjects[0].transform.position.y; } foreach (GameObject item in renderer.terrainObjects) { if (item == null) { continue; } if (renderer.useLayers == false && renderer.terrainObjects[0]) { item.transform.position = new Vector3(item.transform.position.x, item.transform.position.y + HEIGHT_OFFSET, item.transform.position.z); } } } //Set up render texture RenderTexture rt = new RenderTexture(renderer.resolution, renderer.resolution, 0, RenderTextureFormat.ARGB32, RenderTextureReadWrite.Linear); renderer.renderCam.targetTexture = rt; RenderTexture.active = rt; //Render camera into a texture renderer.renderCam.Render(); //Generate heightmap from terrain layers if (isTerrain) { GenerateScalemap(terrains, renderer, rt); } Graphics.SetRenderTarget(rt); Texture2D render = new Texture2D(renderer.resolution, renderer.resolution, TextureFormat.ARGB32, false, true); render.ReadPixels(new Rect(0, 0, renderer.resolution, renderer.resolution), 0, 0); render.Apply(); render.Compress(false); render.name = renderer.colorMap.name; if (!renderer.colorMap.texture) { renderer.colorMap.texture = new Texture2D(renderer.colorMap.resolution, renderer.colorMap.resolution); } //Saving texture if (EditorUtility.IsPersistent(renderer.colorMap)) { //string texPath = AssetDatabase.GetAssetPath(renderer.colorMap.texture); //byte[] bytes = render.EncodeToPNG(); //System.IO.File.WriteAllBytes(texPath, bytes); //AssetDatabase.ImportAsset(texPath, ImportAssetOptions.Default); //SaveTexture(render, renderer.colorMap); EditorUtility.CopySerialized(render, renderer.colorMap.texture); DestroyImmediate(render); } else { renderer.colorMap.texture = render; } SetName(renderer.colorMap); EditorUtility.SetDirty(renderer.colorMap); //Cleanup renderer.renderCam.targetTexture = null; RenderTexture.active = null; DestroyImmediate(rt); DestroyImmediate(renderer.renderCam.gameObject); renderer.renderCam = null; #if URP PipelineUtilities.RemoveRendererFromPipeline(renderer.renderData); #endif if (isTerrain) { //Restore materials foreach (Terrain t in terrains) { t.drawTreesAndFoliage = true; } } //Restore terrains to original position height foreach (var item in renderer.terrainObjects) { if (item == null) { continue; } if (renderer.useLayers == false && renderer.terrainObjects[0]) { item.transform.position = new Vector3(item.transform.position.x, originalTerrainHeight, item.transform.position.z); } } }