うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Bloom 効果を RenderTexture で正しく反映させる方法

Scene 上のオブジェクトには Bloom 効果がかかっているのに、RenderTexture を利用した際に Bloom 効果が反映されないことがあるという現象が起きました。

この問題を解決するために、以下のコードを使用しテストを行いました。

using UnityEngine;
using UnityEngine.UI;

public class BlogComponent : MonoBehaviour
{
    [SerializeField]
    private Camera _targetCamera;
    [SerializeField]
    private RawImage _targetRawImage;
    
    private RenderTexture _renderTexture;
    
    private void Start()
    {
        var width = Screen.width;
        var height = Screen.height;
        _renderTexture = RenderTexture.GetTemporary(width, height, 16);
        _targetCamera.targetTexture = _renderTexture;
        _targetRawImage.texture = _renderTexture;
    }

    private void OnDestroy()
    {
        if (_renderTexture != null)
        {
            RenderTexture.ReleaseTemporary(_renderTexture);
            _renderTexture = null;
        }
    }
}

Bloom、つまり HDR カラーを利用する際には RenderTexture の FormatがB10G11R11_UFloatPack32 または R16G16B16A16_SFloatにする必要があります。デフォルトの RenderTexture のフォーマット R8G8B8A8_UNorm では、輝度の広範な変動を正確に表現するのが難しく、Bloom 効果には適していません。

そのため、Bloomを利用したい場合は以下のようにフォーマットを指定してあげる必要があります。

_renderTexture = RenderTexture.GetTemporary(width, height, 16, GraphicsFormat.R16G16B16A16_SFloat);

この変更により、RenderTexture にも正しく Bloom 効果が反映されるようになりました。