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.
93 lines
3.0 KiB
93 lines
3.0 KiB
using System;
|
|
using UnityEngine;
|
|
|
|
namespace FidelityFX
|
|
{
|
|
public static class Fsr2
|
|
{
|
|
// Allow overriding of certain Unity resource management behaviors by the programmer
|
|
public static Fsr2Callbacks Callbacks { get; set; } = new Fsr2Callbacks();
|
|
|
|
public enum QualityMode
|
|
{
|
|
Quality = 1,
|
|
Balanced = 2,
|
|
Performance = 3,
|
|
UltraPerformance = 4,
|
|
}
|
|
|
|
[Flags]
|
|
public enum InitializationFlagBits
|
|
{
|
|
EnableHighDynamicRange = 1 << 0,
|
|
EnableDisplayResolutionMotionVectors = 1 << 1,
|
|
EnableMotionVectorsJitterCancellation = 1 << 2,
|
|
EnableDepthInverted = 1 << 3,
|
|
EnableDepthInfinite = 1 << 4,
|
|
EnableAutoExposure = 1 << 5,
|
|
EnableDynamicResolution = 1 << 6,
|
|
EnableTexture1DUsage = 1 << 7,
|
|
}
|
|
|
|
public static Fsr2Context CreateContext()
|
|
{
|
|
var context = new Fsr2Context();
|
|
context.Create(Callbacks);
|
|
return context;
|
|
}
|
|
|
|
public static float GetUpscaleRatioFromQualityMode(QualityMode qualityMode)
|
|
{
|
|
switch (qualityMode)
|
|
{
|
|
case QualityMode.Quality:
|
|
return 1.5f;
|
|
case QualityMode.Balanced:
|
|
return 1.7f;
|
|
case QualityMode.Performance:
|
|
return 2.0f;
|
|
case QualityMode.UltraPerformance:
|
|
return 3.0f;
|
|
default:
|
|
return 1.0f;
|
|
}
|
|
}
|
|
|
|
public static void GetRenderResolutionFromQualityMode(
|
|
out uint renderWidth, out uint renderHeight,
|
|
int displayWidth, int displayHeight, QualityMode qualityMode)
|
|
{
|
|
float ratio = GetUpscaleRatioFromQualityMode(qualityMode);
|
|
renderWidth = (uint)(displayWidth / ratio);
|
|
renderHeight = (uint)(displayHeight / ratio);
|
|
}
|
|
|
|
public static int GetJitterPhaseCount(int renderWidth, int displayWidth)
|
|
{
|
|
const float basePhaseCount = 8.0f;
|
|
int jitterPhaseCount = (int)(basePhaseCount * Mathf.Pow((float)displayWidth / renderWidth, 2.0f));
|
|
return jitterPhaseCount;
|
|
}
|
|
|
|
public static void GetJitterOffset(out float outX, out float outY, int index, int phaseCount)
|
|
{
|
|
outX = Halton((index % phaseCount) + 1, 2) - 0.5f;
|
|
outY = Halton((index % phaseCount) + 1, 3) - 0.5f;
|
|
}
|
|
|
|
// Calculate halton number for index and base.
|
|
private static float Halton(int index, int @base)
|
|
{
|
|
float f = 1.0f, result = 0.0f;
|
|
|
|
for (int currentIndex = index; currentIndex > 0;) {
|
|
|
|
f /= @base;
|
|
result += f * (currentIndex % @base);
|
|
currentIndex = (int)Mathf.Floor((float)currentIndex / @base);
|
|
}
|
|
|
|
return result;
|
|
}
|
|
}
|
|
}
|