using UnityEngine.PathTracing.Core;
using UnityEngine.LightTransport;
using UnityEngine.LightTransport.PostProcessing;
using UnityEngine.Rendering;
namespace UnityEngine.PathTracing.PostProcessing
{
// UnityComputeProbePostProcessor was temporarily moved to the Editor assembly because of its unfortunate
// dependency on RadeonRaysProbePostProcessor.DeringSphericalHarmonicsL2 which is editor-only.
// We should move it back to Runtime: https://jira.unity3d.com/browse/GFXFEAT-1035.
internal class UnityComputeProbePostProcessor : IProbePostProcessor
{
ProbePostProcessor _probePostProcessor;
///
/// UnityComputeProbePostProcessor constructor.
/// Expects to be given the "ProbePostProcessing.compute" shader.
///
/// The compute shader containing post processing kernels. Should be the "ProbePostProcessing.compute" shader.
public UnityComputeProbePostProcessor(ComputeShader computeShader)
{
_probePostProcessor = new ProbePostProcessor();
_probePostProcessor.Prepare(computeShader);
}
public bool Initialize(IDeviceContext context)
{
return true;
}
public void Dispose()
{
}
public bool AddSphericalHarmonicsL2(IDeviceContext context, BufferSlice a, BufferSlice b, BufferSlice sum, int probeCount)
{
var unityCtx = context as UnityComputeDeviceContext;
Debug.Assert(unityCtx != null);
_probePostProcessor.AddSphericalHarmonicsL2(
unityCtx.GetCommandBuffer(),
unityCtx.GetComputeBuffer(a.Id),
unityCtx.GetComputeBuffer(b.Id),
unityCtx.GetComputeBuffer(sum.Id),
(uint)a.Offset,
(uint)b.Offset,
(uint)sum.Offset,
(uint)probeCount);
return true;
}
public bool ConvertToUnityFormat(IDeviceContext context, BufferSlice irradianceIn, BufferSlice irradianceOut, int probeCount)
{
var unityCtx = context as UnityComputeDeviceContext;
Debug.Assert(unityCtx != null);
_probePostProcessor.ConvertToUnityFormat(
unityCtx.GetCommandBuffer(),
unityCtx.GetComputeBuffer(irradianceIn.Id),
unityCtx.GetComputeBuffer(irradianceOut.Id),
(uint)irradianceIn.Offset,
(uint)irradianceOut.Offset,
(uint)probeCount);
return true;
}
public bool ConvolveRadianceToIrradiance(IDeviceContext context, BufferSlice radianceIn, BufferSlice irradianceOut, int probeCount)
{
var unityCtx = context as UnityComputeDeviceContext;
Debug.Assert(unityCtx != null);
_probePostProcessor.ConvolveRadianceToIrradiance(
unityCtx.GetCommandBuffer(),
unityCtx.GetComputeBuffer(radianceIn.Id),
unityCtx.GetComputeBuffer(irradianceOut.Id),
(uint)radianceIn.Offset,
(uint)irradianceOut.Offset,
(uint)probeCount);
return true;
}
public bool ScaleSphericalHarmonicsL2(IDeviceContext context, BufferSlice shIn, BufferSlice shOut, int probeCount, float scale)
{
var unityCtx = context as UnityComputeDeviceContext;
Debug.Assert(unityCtx != null);
_probePostProcessor.ScaleSphericalHarmonicsL2(
unityCtx.GetCommandBuffer(),
unityCtx.GetComputeBuffer(shIn.Id),
unityCtx.GetComputeBuffer(shOut.Id),
(uint)shIn.Offset,
(uint)shOut.Offset,
(uint)probeCount,
scale);
return true;
}
public bool WindowSphericalHarmonicsL2(IDeviceContext context, BufferSlice shIn, BufferSlice shOut, int probeCount)
{
var unityCtx = context as UnityComputeDeviceContext;
Debug.Assert(unityCtx != null);
_probePostProcessor.WindowSphericalHarmonicsL2(
unityCtx.GetCommandBuffer(),
unityCtx.GetComputeBuffer(shIn.Id),
unityCtx.GetComputeBuffer(shOut.Id),
(uint)shIn.Offset,
(uint)shOut.Offset,
(uint)probeCount);
return true;
}
public bool DeringSphericalHarmonicsL2(IDeviceContext context, BufferSlice shIn, BufferSlice shOut, int probeCount)
{
using var radeonRaysProbePostProcessor = new RadeonRaysProbePostProcessor();
return radeonRaysProbePostProcessor.DeringSphericalHarmonicsL2(context, shIn, shOut, probeCount);
}
}
}