Unity帧序列实时渲染脚本

基于当前主相机的RenderTexture,好处是可以自定义分辨率等参数,脚本会输出品质为100的jpg序列,基本无损。

而用Application.CaptureScreenshot虽然可以录制包括OnGUI在内全部内容,但有是会png文件头损坏而无法输出视频,且分辨率不可设置

需要注意,unity不会按照渲染帧率来运行,如果是录制用来渲染需要另外写一个时间,用这个每帧间隔相等的时间驱动动画

用管理员权限运行Unity,脚本挂在任意节点上,运行自动录制。

第二次运行自动删除之前录制的内容,重新录制

using UnityEngine;
using System.IO;

public class RealtimeScreenRecorder : MonoBehaviour
{
    public TextureFormat textureFormat = TextureFormat.RGB24;
    public int width = 1280;
    public int height = 720;

    [Header("Example D:/Test/Images/{0:0000}[{1}]")]
    public string savePath;

    Texture2D mTmpTexture2D;
    RenderTexture mRenderTexture;

    RenderTexture RenderTexture
    {
        get
        {
            if (mRenderTexture == null)
            {
                mRenderTexture = new RenderTexture(width, height, 24);
            }

            return mRenderTexture;
        }
    }

    Texture2D TmpTexture2D
    {
        get
        {
            if (mTmpTexture2D == null)
                mTmpTexture2D = new Texture2D(width, height, textureFormat, false);

            return mTmpTexture2D;
        }
    }

    public string FileSavePath
    {
        get
        {
            return string.Format(savePath + ".jpg", Time.frameCount, Time.time);
        }
    }

    void Start()
    {
        var outputPath = Path.GetDirectoryName(string.Format(savePath, 0, 0));
        if (!Directory.Exists(outputPath))
        {
            Directory.CreateDirectory(outputPath);
        }
        else
        {
            Directory.Delete(outputPath, true);
            Directory.CreateDirectory(outputPath);
            //clear old images.
        }
    }

    void Update()
    {
        if (Camera.main == null) return;

        RenderTexture.active = RenderTexture;
        Camera.main.targetTexture = RenderTexture;
        Camera.main.Render();

        TmpTexture2D.ReadPixels(new Rect(0, 0, width, height), 0, 0);
        TmpTexture2D.Apply();

        File.WriteAllBytes(FileSavePath, TmpTexture2D.EncodeToJPG(100));

        Camera.main.targetTexture = null;
        RenderTexture.active = null;
    }

    void OnDestroy()
    {
        RenderTexture.Release();
        DestroyObject(RenderTexture);
        DestroyObject(mTmpTexture2D);

        System.GC.Collect();
    }
}

RealtimeScreenRecorder.cs

录制效果,支持相机滤镜:

时间: 2024-10-26 03:04:40

Unity帧序列实时渲染脚本的相关文章

如何实现最佳的跨平台游戏体验?Unity成亮解密实时渲染技术!

7月31日,2018云创大会游戏论坛在杭州国际博览中心103B圆满举行.本场游戏论坛聚焦探讨了可能对游戏行业发展有重大推动的新技术.新实践,如AR.区块链.安全.大数据等.Unity大中华区技术经理成亮表示,实时渲染技术的跨平台性能让游戏体验变得更好 Unity大中华区技术经理成亮做了<解秘Unity2018最新实时渲染技术>的主题演讲,分享了2018年Unity在实时渲染方面实现的三个重要技术,包括图形相关的可编程渲染管线.基于渲染管线推出的Shader Graph.PostProcess工

克服VR眩晕之帧数 提升UE4内容实时渲染效率

克服VR眩晕之帧数:提升UE4内容实时渲染效率 Li Wen Lei, HuNing 在 2015/10/29 23:00:31 | 新闻 Share on Facebook Share on Twitter Share on Google+ Share on LinkedIn VR已经成为了当今最火热的一个话题,带上头盔之后,从此进入一个奇妙的世界,在这里你不再是观众,你参与这个世界发生的每一件事件.整个世界从此与众不同.在赛道上飞驰,在战场上纵横     但是生理机制让我们的大脑在身体并没有

cocos2d-js 帧序列动画

1.resource.js var res = { playerWalk_plist:"res/playerWalk.plist", playerWalk_png:"res/playerWalk.png" }; var g_resources = []; for (var i in res) { g_resources.push(res[i]); } 2.app.js var HelloWorldLayer = cc.Layer.extend({ sprite:nu

【跟我一起学Unity3D】代码中切割图片并且加载帧序列动画

在Cocos2dx中,对大图的处理已经封装好了一套自己的API,但是在Unity3D中貌似没有类似的API,或者说我没找到.不过这也在情理之中,毕竟Unity3D是做3D的,要切割图片的地方还是很少的. 因为我用Unity3D主要是用于做2D游戏的(PS:很蛋疼吧?我也觉得),所以就不得不考虑切图和播放序列帧这两个在2D上常见的功能了,下面废话不多说.我的任务是把下面这张图切割成16块,并且按照动画的序列播放出来. 查Unity3D的使用手册的过程中,我发现了一个类:Texture2D,他是继承

Xcode6的 实时渲染 在storyboard修改自定义属性

在storyboard 中修改属性可以看到 对应的界面效果,但是自定义类怎么实现呢?Xcode6的 实时渲染可以帮我们实现. 只需要加几句简单代码就可实现,如下图:

Unity使用 UnityVS+VS2013 调试脚本

UnityVS版本:UnityVS_1.8.2 VS版本:VS2013旗舰版 Unity3D版本:4.3.4 安装步骤: 1.如果之前安装过其它版本的UnityVS,请先卸载 2.运行UnityVS 2013.msi 3.找到你安装visual studio 2013的目录. (****\Microsoft Visual Studio12.0\Common7\IDE\Extensions\SyntaxTree\UnityVS) . 例如我是安装在 D:\ProgramFiles(x86)\Mic

[Xcode] Attributes Inspector 界面自定义实时渲染属性

在工程里面新建文件 Cocoa Touch Class  模版选对应的 比如 对 ImageView 扩展 就创建UIImageView 这个对应的类可以在 Identity Inspector 里面看默认的类名字 import UIKit @IBDesignable // 添加这个实现StoryBoard实时渲染结果 class addAttributes: UIImageView { @IBInspectable var cornerRadius: CGFloat = 0 { // @IBI

Unity 3d C#和Javascript脚本互相调用 解决方案(非原创、整理资料,并经过实践得来)

Unity 3d C#和Javascript脚本互相调用 解决方案 1.背景知识 脚本的编译过程分四步: 1. 编译所有 "Standard Assets", "Pro Standard Assets" or "Plugins" 目录下的代码 2. 编译所有"Standard Assets/Editor", "Pro Standard Assets/Editor" or "Plugins/Edit

【跟我一起学Unity3D】代码中分割图片而且载入帧序列动画

在Cocos2dx中.对大图的处理已经封装好了一套自己的API,可是在Unity3D中貌似没有类似的API(好吧,实际上是有的,并且功能更强大),或者说我没找到. 只是这也在情理之中,毕竟Unity3D是做3D的.要分割图片的地方还是非常少的. 由于我用Unity3D主要是用于做2D游戏的(PS:非常蛋疼吧?我也认为),所以就不得不考虑切图和播放序列帧这两个在2D上常见的功能了,以下废话不多说. 我的任务是把以下这张图分割成16块.而且依照动画的序列播放出来. 查Unity3D的使用手冊的过程中