特定のカメラの解像度だけを下げる方法です。
Unity2017.4.6f1
方針
当初、下の記事のように一つのCameraで実現する方法を探っていたのですが、
CommandBufferのレンダーターゲットにBackBufferを指定できず、どうにもうまくいきませんでした。
そこで今回は次の記事のように、Cameraを二つ使う方法を取りました。
メインカメラの描画先を指定解像度の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にアタッチします。
結果
結果は次のようになります。
解像度が下がっていることが確認できました。