CameraのforceIntoRenderTextureをtrueにした際のFrameDebuggerの変化（と少しPostProcessLayerの話）

前回の記事
[CameraのDepthTextureModeをDepth有効にした際のFrameDebuggerの変化](https://qiita.com/ScreenPocket/items/6914902ec42a70133184)
の関連で、次は同じ条件で forceIntoRenderTexture を true にした時の変化をメモしておきます。
[Camera-forceIntoRenderTexture - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/2019.4/ScriptReference/Camera-forceIntoRenderTexture.html)

```cs:DepthCheck.cs
public class DepthCheck : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var camera = GetComponent<Camera>();
        camera.forceIntoRenderTexture = true;
    }
}
```
![スクリーンショット 2020-06-27 12.36.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/08a9d867-936b-c3e3-6cf7-6260844ce3f0.png)

- Event数は3
- Statsは
    - Batches 2
    - SetPass 2
- **メイン描画の描画先は Temp Buffer　になっている**
- **描画パスの末尾にImageEffectが追加されている**
    - 内容としては、DrawDynamicのBlit()で、TempBufferをno nameにコピーしている

この構成どこかで見たなーと思うかもしれませんが、
PostProcessingStackV2で、PostProcessをかけた時と似たような構成になっています。

forceIntoRenderTextureをfalseにして、PostProcessLayerをカメラに付けた時の状態はこちら
![スクリーンショット 2020-06-27 13.02.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/e42e4a4b-7f08-6742-429e-b7524ceb0a86.png)

- **メイン描画部分のRenderTargetはTempBufferになっている**
- BeforeImageEffectsのコマンドが追加されている
    - 最初のDraw Dynamicで TempBuffer を_TargetPool0にコピー
    - 次のBuiltInStack　DrawMeshで _TargetPool0 を TempBufferに戻している
- **末尾にImageEffectsが追加されている**
    - 内容としては、DrawDynamicのBlit()で、TempBufferをno nameにコピーしている

ちなみに、PostProcessLayerのDirectly to Camera Targetのフラグを立てると、BuiltInStack DrawMeshで直接no nameにコピーを行うことで、最後のTempBufferをno nameにコピーするステップを削減できます。
![スクリーンショット 2020-06-27 13.10.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/32c440e0-7e58-5979-b0b2-7d961fd898e5.png)
ただやはり、 **それでもメイン部の描画はTempBufferにされる**ところが注意点かな。

---
[Camera-forceIntoRenderTexture - Unity スクリプトリファレンス](https://docs.unity3d.com/ja/2019.4/ScriptReference/Camera-forceIntoRenderTexture.html)　に
> If set to true camera rendering will always happen into a RenderTexture instead of direct into the backbuffer. This can be useful if you have no image effects but want to use command buffers to act on the current rendering target.
trueに設定すると、カメラのレンダリングは、バックバッファーに直接ではなく、常にRenderTextureで行われます。これは、イメージエフェクトはないが、**コマンドバッファーを使用して現在のレンダリングターゲットを操作する場合**に役立ちます。

とあるように、PostProcessingStackV2みたいにコマンドバッファでImageEffectっぽいことをしようと思った時は、
forceIntoRenderTextureをtrueにすることで、PostProcessingStackと同様の描画フローを辿れそうですね。

---

ちなみに、前回の記事
[CameraのDepthTextureModeをDepth有効にした際のFrameDebuggerの変化](https://qiita.com/ScreenPocket/items/6914902ec42a70133184)
と一緒に指定すると、こうなります。

```cs:DepthCheck.cs
using UnityEngine;

public class DepthCheck : MonoBehaviour
{
    // Start is called before the first frame update
    void Start()
    {
        var camera = GetComponent<Camera>();
        camera.depthTextureMode = DepthTextureMode.Depth;
        camera.forceIntoRenderTexture = true;
    }
}
```
![スクリーンショット 2020-06-27 12.27.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/61266/a0e894a3-fa8f-9592-5c2d-515eb919f904.png)

- 前段にUpdateDepthTextureが追加される
    - 描画先はCameraDepthTexture
- メイン描画部はTempBufferに描画される
- 終段にImageEffects DrawDynamicでTempBufferをno name(フレームバッファ)にコピーしている
- Event数は5
    - 深度バッファ作成に2
    - メイン描画に2
    - 最終コピーで1
- Statsは
    - Batches 3
    - SetPass 3

---
今回も作業メモとして残しておきます。
ここから深度バッファ周りを触っていく予定。