コード例 #1
0
        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);
                }
            }
        }