71 lines
2.6 KiB
C#
71 lines
2.6 KiB
C#
using System;
|
|
using System.Runtime.InteropServices;
|
|
|
|
#if UNITY_EDITOR
|
|
using UnityEditor;
|
|
#endif
|
|
|
|
namespace UnityEngine.Rendering.Sampling
|
|
{
|
|
|
|
internal sealed class SamplingResources : IDisposable
|
|
{
|
|
internal enum ResourceType
|
|
{
|
|
BlueNoiseTextures = 1,
|
|
SobolMatrices = 2,
|
|
All = BlueNoiseTextures | SobolMatrices
|
|
};
|
|
|
|
private Texture2D m_SobolScramblingTile;
|
|
private Texture2D m_SobolRankingTile;
|
|
private Texture2D m_SobolOwenScrambled256Samples;
|
|
private GraphicsBuffer m_SobolBuffer;
|
|
|
|
static public readonly uint[] sobolMatrices = SobolData.SobolMatrices;
|
|
|
|
#if UNITY_EDITOR
|
|
public void Load(uint resourceBitmask = (uint)ResourceType.BlueNoiseTextures)
|
|
{
|
|
if ((resourceBitmask & (uint)ResourceType.BlueNoiseTextures) != 0)
|
|
{
|
|
const string path = "Packages/com.unity.rendering.light-transport/Runtime/";
|
|
|
|
m_SobolScramblingTile = AssetDatabase.LoadAssetAtPath<Texture2D>(path + "Sampling/Textures/SobolBlueNoise/ScramblingTile256SPP.png");
|
|
m_SobolRankingTile = AssetDatabase.LoadAssetAtPath<Texture2D>(path + "Sampling/Textures/SobolBlueNoise/RankingTile256SPP.png");
|
|
m_SobolOwenScrambled256Samples = AssetDatabase.LoadAssetAtPath<Texture2D>(path + "Sampling/Textures/SobolBlueNoise/SobolOwenScrambled256.png");
|
|
}
|
|
|
|
if ((resourceBitmask & (uint)ResourceType.SobolMatrices) != 0)
|
|
{
|
|
int sobolBufferSize = (int)(SobolData.SobolDims * SobolData.SobolSize);
|
|
m_SobolBuffer = new GraphicsBuffer(GraphicsBuffer.Target.Structured, sobolBufferSize, Marshal.SizeOf<uint>());
|
|
m_SobolBuffer.SetData(SobolData.SobolMatrices);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
public static void BindSobolBlueNoiseTextures(CommandBuffer cmd, SamplingResources resources)
|
|
{
|
|
if (resources.m_SobolScramblingTile != null)
|
|
{
|
|
cmd.SetGlobalTexture(Shader.PropertyToID("_SobolScramblingTile"), resources.m_SobolScramblingTile);
|
|
cmd.SetGlobalTexture(Shader.PropertyToID("_SobolRankingTile"), resources.m_SobolRankingTile);
|
|
cmd.SetGlobalTexture(Shader.PropertyToID("_SobolOwenScrambledSequence"), resources.m_SobolOwenScrambled256Samples);
|
|
}
|
|
|
|
if (resources.m_SobolBuffer != null)
|
|
cmd.SetGlobalBuffer("_SobolMatricesBuffer", resources.m_SobolBuffer);
|
|
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
m_SobolBuffer?.Dispose();
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
|