You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.6 KiB
70 lines
2.6 KiB
using System.Runtime.CompilerServices;
|
|
using RuntimeResources = UnityEngine.Rendering.ProbeReferenceVolume.RuntimeResources;
|
|
|
|
namespace UnityEngine.Rendering
|
|
{
|
|
internal static class DynamicSkyPrecomputedDirections
|
|
{
|
|
const int NB_SKY_PRECOMPUTED_DIRECTIONS = 255;
|
|
|
|
static ComputeBuffer m_DirectionsBuffer = null;
|
|
static Vector3[] m_Directions = null;
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
internal static void GetRuntimeResources(ref RuntimeResources rr)
|
|
{
|
|
rr.SkyPrecomputedDirections = m_DirectionsBuffer;
|
|
}
|
|
|
|
[MethodImpl(MethodImplOptions.AggressiveInlining)]
|
|
internal static Vector3[] GetPrecomputedDirections()
|
|
{
|
|
return m_Directions;
|
|
}
|
|
|
|
internal static void Initialize()
|
|
{
|
|
if (m_DirectionsBuffer == null)
|
|
{
|
|
m_Directions = new Vector3[NB_SKY_PRECOMPUTED_DIRECTIONS];
|
|
m_DirectionsBuffer = new ComputeBuffer(m_Directions.Length, 3 * sizeof(float));
|
|
|
|
float sqrtNBpoints = Mathf.Sqrt((float)(NB_SKY_PRECOMPUTED_DIRECTIONS));
|
|
float phi = 0.0f;
|
|
float phiMax = 0.0f;
|
|
float thetaMax = 0.0f;
|
|
|
|
// Spiral based sampling on sphere
|
|
// See http://web.archive.org/web/20120331125729/http://www.math.niu.edu/~rusin/known-math/97/spherefaq
|
|
// http://www.math.vanderbilt.edu/saffeb/texts/161.pdf
|
|
for (int i=0; i < NB_SKY_PRECOMPUTED_DIRECTIONS; i++)
|
|
{
|
|
// theta from 0 to PI
|
|
// phi from 0 to 2PI
|
|
float h = -1.0f + (2.0f * i) / (NB_SKY_PRECOMPUTED_DIRECTIONS - 1.0f);
|
|
float theta = Mathf.Acos(h);
|
|
if (i == NB_SKY_PRECOMPUTED_DIRECTIONS - 1 || i==0)
|
|
phi = 0.0f;
|
|
else
|
|
phi = phi + 3.6f / sqrtNBpoints * 1.0f / (Mathf.Sqrt(1.0f-h*h));
|
|
|
|
Vector3 pointOnSphere = new Vector3(Mathf.Sin(theta) * Mathf.Cos(phi), Mathf.Sin(theta) * Mathf.Sin(phi), Mathf.Cos(theta));
|
|
|
|
pointOnSphere.Normalize();
|
|
m_Directions[i] = pointOnSphere;
|
|
|
|
phiMax = Mathf.Max(phiMax, phi);
|
|
thetaMax = Mathf.Max(thetaMax, theta);
|
|
}
|
|
m_DirectionsBuffer.SetData(m_Directions);
|
|
}
|
|
}
|
|
|
|
internal static void Cleanup()
|
|
{
|
|
CoreUtils.SafeRelease(m_DirectionsBuffer);
|
|
m_DirectionsBuffer = null;
|
|
m_Directions = null;
|
|
}
|
|
}
|
|
}
|