Browse Source
Added asset container scriptable objects for optical flow and frame interpolation shaders.
fsr3framegen
Added asset container scriptable objects for optical flow and frame interpolation shaders.
fsr3framegen
6 changed files with 358 additions and 0 deletions
-
8Runtime/FrameInterpolation.meta
-
176Runtime/FrameInterpolation/FrameInterpolationAssets.cs
-
11Runtime/FrameInterpolation/FrameInterpolationAssets.cs.meta
-
8Runtime/OpticalFlow.meta
-
144Runtime/OpticalFlow/OpticalFlowAssets.cs
-
11Runtime/OpticalFlow/OpticalFlowAssets.cs.meta
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: bd29728b817dd3f478a426dcb34e360b |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,176 @@ |
|||||
|
// Copyright (c) 2024 Nico de Poel
|
||||
|
//
|
||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||
|
// in the Software without restriction, including without limitation the rights
|
||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||
|
// furnished to do so, subject to the following conditions:
|
||||
|
//
|
||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||
|
// copies or substantial portions of the Software.
|
||||
|
//
|
||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
|
// THE SOFTWARE.
|
||||
|
|
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace FidelityFX.FrameInterpolation |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Scriptable object containing all shader resources required by FidelityFX Frame Interpolation.
|
||||
|
/// These can be stored in an asset file and referenced from a scene or prefab, avoiding the need to load the shaders from a Resources folder.
|
||||
|
/// </summary>
|
||||
|
[CreateAssetMenu(fileName = "Frame Interpolation Assets", menuName = "FidelityFX/Frame Interpolation Assets", order = 1112)] |
||||
|
public class FrameInterpolationAssets : ScriptableObject |
||||
|
{ |
||||
|
public FrameInterpolationShaders shaders; |
||||
|
|
||||
|
#if UNITY_EDITOR
|
||||
|
private void Reset() |
||||
|
{ |
||||
|
shaders = new FrameInterpolationShaders |
||||
|
{ |
||||
|
reconstructAndDilate = FindComputeShader("ffx_frameinterpolation_reconstruct_and_dilate_pass"), |
||||
|
setup = FindComputeShader("ffx_frameinterpolation_setup_pass"), |
||||
|
reconstructPreviousDepth = FindComputeShader("ffx_frameinterpolation_reconstruct_previous_depth_pass"), |
||||
|
gameMotionVectorField = FindComputeShader("ffx_frameinterpolation_game_motion_vector_field_pass"), |
||||
|
opticalFlowVectorField = FindComputeShader("ffx_frameinterpolation_optical_flow_vector_field_pass"), |
||||
|
disocclusionMask = FindComputeShader("ffx_frameinterpolation_disocclusion_mask_pass"), |
||||
|
interpolation = FindComputeShader("ffx_frameinterpolation_pass"), |
||||
|
inpaintingPyramid = FindComputeShader("ffx_frameinterpolation_compute_inpainting_pyramid_pass"), |
||||
|
inpainting = FindComputeShader("ffx_frameinterpolation_inpainting_pass"), |
||||
|
gameVectorFieldInpaintingPyramid = FindComputeShader("ffx_frameinterpolation_compute_game_vector_field_inpainting_pyramid_pass"), |
||||
|
debugView = FindComputeShader("ffx_frameinterpolation_debug_view_pass"), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
private static ComputeShader FindComputeShader(string name) |
||||
|
{ |
||||
|
string[] assetGuids = UnityEditor.AssetDatabase.FindAssets($"t:ComputeShader {name}"); |
||||
|
if (assetGuids == null || assetGuids.Length == 0) |
||||
|
return null; |
||||
|
|
||||
|
string assetPath = UnityEditor.AssetDatabase.GUIDToAssetPath(assetGuids[0]); |
||||
|
return UnityEditor.AssetDatabase.LoadAssetAtPath<ComputeShader>(assetPath); |
||||
|
} |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// All the compute shaders used by Frame Interpolation.
|
||||
|
/// </summary>
|
||||
|
[System.Serializable] |
||||
|
public class FrameInterpolationShaders |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the reconstruct and dilate pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader reconstructAndDilate; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the setup pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader setup; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the reconstruct previous depth pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader reconstructPreviousDepth; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the game motion vector field pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader gameMotionVectorField; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the optical flow vector field pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader opticalFlowVectorField; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the disocclusion mask pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader disocclusionMask; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the interpolation pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader interpolation; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the inpainting pyramid pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader inpaintingPyramid; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the inpainting pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader inpainting; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the game vector field inpainting pyramid pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader gameVectorFieldInpaintingPyramid; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the debug view pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader debugView; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a copy of this class and its contents.
|
||||
|
/// </summary>
|
||||
|
public FrameInterpolationShaders Clone() |
||||
|
{ |
||||
|
return (FrameInterpolationShaders)MemberwiseClone(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a copy of this class with clones of all its shaders.
|
||||
|
/// This can be useful if you're running multiple Frame Interpolation instances with different shader configurations.
|
||||
|
/// Be sure to clean up these clones through Dispose once you're done with them.
|
||||
|
/// </summary>
|
||||
|
public FrameInterpolationShaders DeepCopy() |
||||
|
{ |
||||
|
return new FrameInterpolationShaders |
||||
|
{ |
||||
|
reconstructAndDilate = Object.Instantiate(reconstructAndDilate), |
||||
|
setup = Object.Instantiate(setup), |
||||
|
reconstructPreviousDepth = Object.Instantiate(reconstructPreviousDepth), |
||||
|
gameMotionVectorField = Object.Instantiate(gameMotionVectorField), |
||||
|
opticalFlowVectorField = Object.Instantiate(opticalFlowVectorField), |
||||
|
disocclusionMask = Object.Instantiate(disocclusionMask), |
||||
|
interpolation = Object.Instantiate(interpolation), |
||||
|
inpaintingPyramid = Object.Instantiate(inpaintingPyramid), |
||||
|
inpainting = Object.Instantiate(inpainting), |
||||
|
gameVectorFieldInpaintingPyramid = Object.Instantiate(gameVectorFieldInpaintingPyramid), |
||||
|
debugView = Object.Instantiate(debugView), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Destroy all the shaders within this instance.
|
||||
|
/// Use this only on clones created through DeepCopy.
|
||||
|
/// </summary>
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
Object.Destroy(debugView); |
||||
|
Object.Destroy(gameVectorFieldInpaintingPyramid); |
||||
|
Object.Destroy(inpainting); |
||||
|
Object.Destroy(inpaintingPyramid); |
||||
|
Object.Destroy(interpolation); |
||||
|
Object.Destroy(disocclusionMask); |
||||
|
Object.Destroy(opticalFlowVectorField); |
||||
|
Object.Destroy(gameMotionVectorField); |
||||
|
Object.Destroy(reconstructPreviousDepth); |
||||
|
Object.Destroy(setup); |
||||
|
Object.Destroy(reconstructAndDilate); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 1f0e52bd03044d74f8e7ea17af3c8d7b |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,8 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 52b9ee437d2c45248a5410ed4160929e |
||||
|
folderAsset: yes |
||||
|
DefaultImporter: |
||||
|
externalObjects: {} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
@ -0,0 +1,144 @@ |
|||||
|
// Copyright (c) 2024 Nico de Poel
|
||||
|
//
|
||||
|
// Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
|
// of this software and associated documentation files (the "Software"), to deal
|
||||
|
// in the Software without restriction, including without limitation the rights
|
||||
|
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
|
// copies of the Software, and to permit persons to whom the Software is
|
||||
|
// furnished to do so, subject to the following conditions:
|
||||
|
//
|
||||
|
// The above copyright notice and this permission notice shall be included in all
|
||||
|
// copies or substantial portions of the Software.
|
||||
|
//
|
||||
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
|
// THE SOFTWARE.
|
||||
|
|
||||
|
using UnityEngine; |
||||
|
|
||||
|
namespace FidelityFX.OpticalFlow |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// Scriptable object containing all shader resources required by FidelityFX Optical Flow.
|
||||
|
/// These can be stored in an asset file and referenced from a scene or prefab, avoiding the need to load the shaders from a Resources folder.
|
||||
|
/// </summary>
|
||||
|
[CreateAssetMenu(fileName = "Optical Flow Assets", menuName = "FidelityFX/Optical Flow Assets", order = 1111)] |
||||
|
public class OpticalFlowAssets : ScriptableObject |
||||
|
{ |
||||
|
public OpticalFlowShaders shaders; |
||||
|
|
||||
|
#if UNITY_EDITOR
|
||||
|
private void Reset() |
||||
|
{ |
||||
|
shaders = new OpticalFlowShaders |
||||
|
{ |
||||
|
generateOpticalFlowInputPyramid = FindComputeShader("ffx_opticalflow_compute_luminance_pyramid_pass"), |
||||
|
prepareLuma = FindComputeShader("ffx_opticalflow_prepare_luma_pass"), |
||||
|
generateScdHistogram = FindComputeShader("ffx_opticalflow_generate_scd_histogram_pass"), |
||||
|
computeScdDivergence = FindComputeShader("ffx_opticalflow_compute_scd_divergence_pass"), |
||||
|
computeOpticalFlow = FindComputeShader("ffx_opticalflow_compute_optical_flow_advanced_pass_v5"), |
||||
|
filterOpticalFlow = FindComputeShader("ffx_opticalflow_filter_optical_flow_pass_v5"), |
||||
|
scaleOpticalFlow = FindComputeShader("ffx_opticalflow_scale_optical_flow_advanced_pass_v5"), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
private static ComputeShader FindComputeShader(string name) |
||||
|
{ |
||||
|
string[] assetGuids = UnityEditor.AssetDatabase.FindAssets($"t:ComputeShader {name}"); |
||||
|
if (assetGuids == null || assetGuids.Length == 0) |
||||
|
return null; |
||||
|
|
||||
|
string assetPath = UnityEditor.AssetDatabase.GUIDToAssetPath(assetGuids[0]); |
||||
|
return UnityEditor.AssetDatabase.LoadAssetAtPath<ComputeShader>(assetPath); |
||||
|
} |
||||
|
#endif
|
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// All the compute shaders used by Optical Flow.
|
||||
|
/// </summary>
|
||||
|
[System.Serializable] |
||||
|
public class OpticalFlowShaders |
||||
|
{ |
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the generate optical flow input pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader generateOpticalFlowInputPyramid; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the prepare luma pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader prepareLuma; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the generate SCD histogram pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader generateScdHistogram; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the compute SCD divergence pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader computeScdDivergence; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the compute optical flow pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader computeOpticalFlow; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the filter optical flow pass.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader filterOpticalFlow; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// The compute shader used by the scale optical flow mask.
|
||||
|
/// </summary>
|
||||
|
public ComputeShader scaleOpticalFlow; |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a copy of this class and its contents.
|
||||
|
/// </summary>
|
||||
|
public OpticalFlowShaders Clone() |
||||
|
{ |
||||
|
return (OpticalFlowShaders)MemberwiseClone(); |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Returns a copy of this class with clones of all its shaders.
|
||||
|
/// This can be useful if you're running multiple Optical Flow instances with different shader configurations.
|
||||
|
/// Be sure to clean up these clones through Dispose once you're done with them.
|
||||
|
/// </summary>
|
||||
|
public OpticalFlowShaders DeepCopy() |
||||
|
{ |
||||
|
return new OpticalFlowShaders |
||||
|
{ |
||||
|
generateOpticalFlowInputPyramid = Object.Instantiate(generateOpticalFlowInputPyramid), |
||||
|
prepareLuma = Object.Instantiate(prepareLuma), |
||||
|
generateScdHistogram = Object.Instantiate(generateScdHistogram), |
||||
|
computeScdDivergence = Object.Instantiate(computeScdDivergence), |
||||
|
computeOpticalFlow = Object.Instantiate(computeOpticalFlow), |
||||
|
filterOpticalFlow = Object.Instantiate(filterOpticalFlow), |
||||
|
scaleOpticalFlow = Object.Instantiate(scaleOpticalFlow), |
||||
|
}; |
||||
|
} |
||||
|
|
||||
|
/// <summary>
|
||||
|
/// Destroy all the shaders within this instance.
|
||||
|
/// Use this only on clones created through DeepCopy.
|
||||
|
/// </summary>
|
||||
|
public void Dispose() |
||||
|
{ |
||||
|
Object.Destroy(scaleOpticalFlow); |
||||
|
Object.Destroy(filterOpticalFlow); |
||||
|
Object.Destroy(computeOpticalFlow); |
||||
|
Object.Destroy(computeScdDivergence); |
||||
|
Object.Destroy(generateScdHistogram); |
||||
|
Object.Destroy(prepareLuma); |
||||
|
Object.Destroy(generateOpticalFlowInputPyramid); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
fileFormatVersion: 2 |
||||
|
guid: 0ac13db1d14fa3f498ce3c78c44dfb84 |
||||
|
MonoImporter: |
||||
|
externalObjects: {} |
||||
|
serializedVersion: 2 |
||||
|
defaultReferences: [] |
||||
|
executionOrder: 0 |
||||
|
icon: {instanceID: 0} |
||||
|
userData: |
||||
|
assetBundleName: |
||||
|
assetBundleVariant: |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue