//////////////////////////////////////////////////////
// MK Glow RenderTargetContext //
// //
// Created by Michael Kremmel //
// www.michaelkremmel.de //
// Copyright © 2021 All rights reserved. //
//////////////////////////////////////////////////////
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;
namespace MK.Glow
{
//To reduce garbage collection this part is hardcoded
///
/// Render targets based on a given render context
///
internal static class RenderTargetContext
{
private static int _renderTargetCount;
private static RenderTargetSetup[] _mrtBindingsLegacy = new RenderTargetSetup[6]
{
new RenderTargetSetup
(
new RenderBuffer[1],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[1]{RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[1]{RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
,
new RenderTargetSetup
(
new RenderBuffer[2],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[2]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[2]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
,
new RenderTargetSetup
(
new RenderBuffer[3],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[3]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[3]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
,
new RenderTargetSetup
(
new RenderBuffer[4],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[4]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[4]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
,
new RenderTargetSetup
(
new RenderBuffer[5],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[5]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[5]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
,
new RenderTargetSetup
(
new RenderBuffer[6],
new RenderBuffer(),
0,
CubemapFace.Unknown,
new RenderBufferLoadAction[6]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[6]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
#if UNITY_2018_3_OR_NEWER
{ depthSlice = -1 }
#endif
};
#if UNITY_2018_3_OR_NEWER
private static RenderTargetBinding[] _mrtBindingsSRP = new RenderTargetBinding[6]
{
new RenderTargetBinding
(
new RenderTargetIdentifier[1],
new RenderBufferLoadAction[1]{RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[1]{RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
),
new RenderTargetBinding
(
new RenderTargetIdentifier[2],
new RenderBufferLoadAction[2]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[2]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
),
new RenderTargetBinding
(
new RenderTargetIdentifier[3],
new RenderBufferLoadAction[3]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[3]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
),
new RenderTargetBinding
(
new RenderTargetIdentifier[4],
new RenderBufferLoadAction[4]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[4]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
),
new RenderTargetBinding
(
new RenderTargetIdentifier[5],
new RenderBufferLoadAction[5]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[5]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
),
new RenderTargetBinding
(
new RenderTargetIdentifier[6],
new RenderBufferLoadAction[6]{RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare, RenderBufferLoadAction.DontCare},
new RenderBufferStoreAction[6]{RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store, RenderBufferStoreAction.Store},
0, RenderBufferLoadAction.DontCare, RenderBufferStoreAction.DontCare
)
};
internal static void SetRenderTargetContext(this CommandBuffer cmd, List renderTargets)
{
_renderTargetCount = renderTargets.Count - 1;
for(int i = 0; i <= _renderTargetCount; i++)
{
_mrtBindingsSRP[_renderTargetCount].colorRenderTargets[i] = renderTargets[i].renderTargetIdentifier;
}
_mrtBindingsSRP[_renderTargetCount].depthRenderTarget = _mrtBindingsSRP[_renderTargetCount].colorRenderTargets[0];
#if UNITY_2019_1_OR_NEWER
cmd.SetRenderTarget(_mrtBindingsSRP[_renderTargetCount], 0, CubemapFace.Unknown, -1);
#else
cmd.SetRenderTarget(_mrtBindingsSRP[_renderTargetCount]);
#endif
}
#else
private static RenderTargetIdentifier[][] _mrtBindingsSRP = new RenderTargetIdentifier[6][]
{
new RenderTargetIdentifier[1]{new RenderTargetIdentifier()},
new RenderTargetIdentifier[2]{new RenderTargetIdentifier(), new RenderTargetIdentifier()},
new RenderTargetIdentifier[3]{new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier()},
new RenderTargetIdentifier[4]{new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier()},
new RenderTargetIdentifier[5]{new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier(), new RenderTargetIdentifier()},
new RenderTargetIdentifier[6]{new RenderTargetIdentifier(), new RenderTargetIdentifier() ,new RenderTargetIdentifier(), new RenderTargetIdentifier() ,new RenderTargetIdentifier(), new RenderTargetIdentifier()}
};
internal static void SetRenderTargetContext(this CommandBuffer cmd, List renderTargets, RenderTarget depthBuffer)
{
_renderTargetCount = renderTargets.Count - 1;
for(int i = 0; i <= _renderTargetCount; i++)
{
_mrtBindingsSRP[_renderTargetCount][i] = renderTargets[i].renderTargetIdentifier;
}
cmd.SetRenderTarget(_mrtBindingsSRP[_renderTargetCount], _mrtBindingsSRP[_renderTargetCount][0]);
}
#endif
internal static void SetRenderTargetContext(List renderTargets)
{
_renderTargetCount = renderTargets.Count - 1;
for(int i = 0; i <= _renderTargetCount; i++)
{
_mrtBindingsLegacy[_renderTargetCount].color[i] = renderTargets[i].renderTexture.colorBuffer;
}
_mrtBindingsLegacy[_renderTargetCount].depth = renderTargets[_renderTargetCount].renderTexture.depthBuffer;
Graphics.SetRenderTarget(_mrtBindingsLegacy[_renderTargetCount]);
}
}
}