2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

UnityでRGBとDepthの連番画像を出力してAfterEffectsに読み込む

Posted at

Unityで動画用素材を作成するときに、AfterEffectsなどの動画編集ソフトで編集しやすいように、RGBとDepthの連番画像を出力する方法について書きます。
今回はRenderTextureに描画された1フレームごとのRGBと深度画像をEXR形式で保存するようにします。
基本的にPNGなどでも同じようにできます。
また、AfterEffectでの読み込み方も記載します。

Depthを出力できると、AfterEffectsのマスクなどで活用できるので楽しいです。

実行環境

  • OS Windows10
  • Unity 2020.3.17f1
  • AfterEffects 2021

Unity側の準備

Unity Recorder

UnityPackageManagerからUnity Recorderをインポートします。
インポートできたら、Unityの上部タブのWindow>General>Recorder>Recorder Window からウインドウを開いておきましょう。
image.png

CameraとRenderTextureの設定

RGBとDepth用のカメラを別々に作り、それぞれの出力先のRenderTextureも分けて作るようにします。
まず、RenderTextureですが、解像度は以下の画像のような設定で作ります(必要に応じて適宜変えてください)。RGB用とDepth用で2つ作っておきましょう。
そして、CameraのtargetTextureにそれぞれのRenderTextureを設定しておきます。
image.png

RGBカメラの方はこれで完了ですが、Depth出力用に以下のScriptとShaderを作成してください。
作成したScriptをDepth用のCameraにアタッチして、shaderにDepth.shaderをセットします。

  • DepthRenderer.cs
using UnityEngine;

public class DepthRenderer : MonoBehaviour
{
    [SerializeField]
    private Shader _shader;
    private Material _material;

    void Start()
    {
        GetComponent<Camera>().depthTextureMode |= DepthTextureMode.Depth;
        _material = new Material(_shader);
    }

    private void OnRenderImage(RenderTexture source, RenderTexture dest)
    {
        Graphics.Blit(source, dest, _material);
    }
}
  • Depth.shader
Shader "Custom/ShowDepthTexture"
{
    SubShader
    {
        Cull Off
        ZTest Always
        ZWrite Off

        Tags { "RenderType"="Opaque" }

        Pass
        {
            CGPROGRAM
           #pragma vertex vert
           #pragma fragment frag
           #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };
            
            sampler2D _CameraDepthTexture;
            
            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }
            
            fixed4 frag (v2f i) : SV_Target
            {
                fixed depth = UNITY_SAMPLE_DEPTH(tex2D(_CameraDepthTexture, i.uv));
                depth = LinearEyeDepth(depth);
                return depth;
            }
            ENDCG
        }
    }
}

Recorderの設定

RecorderのAdd New Recordersをクリックして、Image Sequenceを追加しましょう。
細かい設定については適宜変更していただいて構いませんが、File Nameには必ず<Frame> を入れましょう。この<Frame> にフレーム数が入ってファイルが出力されます。
RGBとDepthのシーケンスをそれぞれ作って別々のファイル名にしておきましょう。フォルダも分けておいた方がいいです。
image.png
以上で設定は完了です。

録画

StartRecordingを押すことで、録画を開始します。
うまく録画できるとこのようなファイルが出力されています。
image.png

AfterEffectsで読み込む

出力したファイルをAfterEffectsで読み込みます。
プロジェクトを作成し、まずはRGBのファイルの読み込みを行います。
このとき、連番画像を全選択し、OpenEXRシーケンスにチェックを入れて読み込みましょう。
Depthも同様です。
image.png

これで読み込みは完了です。

AfterEffectsで深度情報をマスクなどで使えるようになります。

AfterEffectsで読み込んだ画像が白飛びしている

AfterEffectsのプロジェクト設定>カラーを選択してください。
「作業用スペースをリニア可」にチェックが入っていない場合はチェックを入れましょう。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?