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); } } }