【Unity】特定のカメラのみ低解像度にする

f:id:halya_11:20180806200828g:plain

特定のカメラの解像度だけを下げる方法です。

Unity2017.4.6f1

方針

当初、下の記事のように一つのCameraで実現する方法を探っていたのですが、
CommandBufferのレンダーターゲットにBackBufferを指定できず、どうにもうまくいきませんでした。

appleorbit.hatenablog.com

そこで今回は次の記事のように、Cameraを二つ使う方法を取りました。

qiita.com

メインカメラの描画先を指定解像度のRenderTextureにし、
もう一つのカメラでRenderTextureをバックバッファに描画します。

Cameraを二つ使うとはいえ、2つ目のカメラは単純にRenderTextureをバックバッファにBlitしているだけなので処理負荷は大きくないはずです。
念のためFrameBufferで確認しましたが無駄な処理はやっていませんでした。

実装

using UnityEngine;
using UnityEngine.Rendering;

public class RenderTargetScaler : MonoBehaviour
{
    [SerializeField]
    private float _scale = 1.0f;
    
    private Camera _camera;
    private Camera _backBufferCamera;
    private RenderTexture _frameBuffer;
    private CommandBuffer _commandBuffer;

    private void Awake() 
    {
        Initialize();
        Setup();
    }

    /// <summary>
    /// 初期化する
    /// </summary>
    private void Initialize()
    {
        _camera = GetComponent<Camera>();
        var backBufferCameraGo = new GameObject("Back Buffer Camera");
        _backBufferCamera = backBufferCameraGo.AddComponent<Camera>();
        _backBufferCamera.cullingMask = 0;
        _backBufferCamera.transform.parent = transform;
        _backBufferCamera.clearFlags = CameraClearFlags.Nothing;
        _backBufferCamera.useOcclusionCulling = false;
        _backBufferCamera.allowHDR = false;
        _backBufferCamera.allowMSAA = false;
        _backBufferCamera.allowDynamicResolution = false;
    }

    /// <summary>
    /// 今のScale値を元にセットアップする
    /// </summary>
    private void Setup()
    {
        // メインカメラのレンダーターゲットにスケーリングした解像度のRenderTextureを指定する
        if (_frameBuffer != null) {
            _frameBuffer.Release();
            Destroy(_frameBuffer);
            _frameBuffer = null;
        }
        var width = (int)(Screen.width * _scale);
        var height = (int)(Screen.height * _scale);
        
        _frameBuffer = new RenderTexture(width, height, 24, RenderTextureFormat.ARGB32);
        _frameBuffer.useMipMap = false;
        _frameBuffer.filterMode = FilterMode.Bilinear;
        _frameBuffer.Create();
        _camera.targetTexture = _frameBuffer;

        // バックバッファ描画用のカメラにCommandBufferを設定する
        if (_commandBuffer != null) {
            _backBufferCamera.RemoveCommandBuffer(CameraEvent.AfterEverything, _commandBuffer);
            _commandBuffer = null;
        }
        _commandBuffer = new CommandBuffer();
        _commandBuffer.name = "Blit to back buffer";
        _commandBuffer.Blit((RenderTargetIdentifier)_frameBuffer, BuiltinRenderTextureType.CameraTarget);
        _backBufferCamera.AddCommandBuffer (CameraEvent.AfterEverything, _commandBuffer);
    }
}

これを解像度を下げたいCameraにアタッチします。

結果

結果は次のようになります。

f:id:halya_11:20180806200828g:plain

解像度が下がっていることが確認できました。

関連

light11.hatenadiary.com

参考

qiita.com