[Unity3d]保存相机当前渲染内容或者RenderTexture到本地小工具

项目中,遇到需要将相机当前渲染的内容或者是RenderTexture保存到本地的需求,查看渲染结果是否正确。因此,写了一个简单的小工具,按F4就可以保存到Assets上一级目录。

先直接贴代码,有时间再详细解释
使用方式是直接将脚本挂在需要的camera上,按F4保存截图。

using UnityEngine;
using System;
using System.IO;
public class SaveCamTexture : MonoBehaviour
{
    public Camera cam;
    public RenderTexture rt;
    public void Start()
    {
        if(cam==null)
        {
            cam = this.GetComponent();
        }
    }
    private void Update()
    {
        if(cam==null)
        { return; }
        if(Input.GetKeyDown(KeyCode.F4))
        {
            _SaveCamTexture();
        }
    }
    private void _SaveCamTexture()
    {
        rt = cam.targetTexture;
        if(rt!=null)
        {
            _SaveRenderTexture(rt);
            rt = null;
        }
        else
        {
            GameObject camGo = new GameObject("camGO");
            Camera tmpCam = camGo.AddComponent();
            tmpCam.CopyFrom(cam);
           // rt = new RenderTexture(Screen.width, Screen.height, 16, RenderTextureFormat.ARGB32);
            rt =RenderTexture.GetTemporary(Screen.width,Screen.height,16, RenderTextureFormat.ARGB32);

            tmpCam.targetTexture = rt;
            tmpCam.Render();
            _SaveRenderTexture(rt);
            Destroy(camGo);
            //rt.Release();
            RenderTexture.ReleaseTemporary(rt);
            //Destroy(rt);
            rt = null;
        }

    }
    private void _SaveRenderTexture(RenderTexture rt)
    {
        RenderTexture active = RenderTexture.active;
        RenderTexture.active = rt;
        Texture2D png = new Texture2D(rt.width, rt.height, TextureFormat.ARGB32, false);
        png.ReadPixels(new Rect(0, 0, rt.width, rt.height), 0, 0);
        png.Apply();
        RenderTexture.active = active;
        byte[] bytes = png.EncodeToPNG();
        string path = string.Format("Assets/../rt_{0}_{1}_{2}.png", DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second);
        FileStream fs = File.Open(path, FileMode.Create);
        BinaryWriter writer = new BinaryWriter(fs);
        writer.Write(bytes);
        writer.Flush();
        writer.Close();
        fs.Close();
        Destroy(png);
        png = null;
        Debug.Log("保存成功!"+path);
    }
}


文档中说,可以使用RenderTexture.GetTemporary()方法来获取RenderTexture池中的一个(如果尺寸匹配),速度回比较快;并且,对应的使用RenderTexture。ReleaseTemporary()来释放。
此方法适用于需要一个renderTexture做一些临时的计算时候使用。
试了一下,之前保存图片的时候有明显的卡顿,而改过之后,卡顿明显改善。

你可能感兴趣的:(unity)