using System; #if UNITY_EDITOR using UnityEditor; #endif namespace UnityEngine.Rendering.UnifiedRayTracing { [Scripting.APIUpdating.MovedFrom( autoUpdateAPI: true, sourceNamespace: "UnityEngine.Rendering.UnifiedRayTracing", sourceAssembly: "Unity.Rendering.LightTransport.Runtime" )] [Serializable] [SupportedOnRenderPipeline()] [Categorization.CategoryInfo(Name = "R: Unified Ray Tracing", Order = 1000), HideInInspector] internal class RayTracingRenderPipelineResources : IRenderPipelineResources { [SerializeField, HideInInspector] int m_Version = 1; public int version { get => m_Version; } [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute")] ComputeShader m_GeometryPoolKernels; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Common/Utilities/CopyBuffer.compute")] ComputeShader m_CopyBuffer; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute")] ComputeShader m_CopyPositions; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute")] ComputeShader m_BitHistogram; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute")] ComputeShader m_BlockReducePart; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute")] ComputeShader m_BlockScan; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute")] ComputeShader m_BuildHlbvh; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute")] ComputeShader m_RestructureBvh; [SerializeField, ResourcePath("Runtime/UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute")] ComputeShader m_Scatter; public ComputeShader GeometryPoolKernels { get => m_GeometryPoolKernels; set => this.SetValueAndNotify(ref m_GeometryPoolKernels, value, nameof(m_GeometryPoolKernels)); } public ComputeShader CopyBuffer { get => m_CopyBuffer; set => this.SetValueAndNotify(ref m_CopyBuffer, value, nameof(m_CopyBuffer)); } public ComputeShader CopyPositions { get => m_CopyPositions; set => this.SetValueAndNotify(ref m_CopyPositions, value, nameof(m_CopyPositions)); } public ComputeShader BitHistogram { get => m_BitHistogram; set => this.SetValueAndNotify(ref m_BitHistogram, value, nameof(m_BitHistogram)); } public ComputeShader BlockReducePart { get => m_BlockReducePart; set => this.SetValueAndNotify(ref m_BlockReducePart, value, nameof(m_BlockReducePart)); } public ComputeShader BlockScan { get => m_BlockScan; set => this.SetValueAndNotify(ref m_BlockScan, value, nameof(m_BlockScan)); } public ComputeShader BuildHlbvh { get => m_BuildHlbvh; set => this.SetValueAndNotify(ref m_BuildHlbvh, value, nameof(m_BuildHlbvh)); } public ComputeShader RestructureBvh { get => m_RestructureBvh; set => this.SetValueAndNotify(ref m_RestructureBvh, value, nameof(m_RestructureBvh)); } public ComputeShader Scatter { get => m_Scatter; set => this.SetValueAndNotify(ref m_Scatter, value, nameof(m_Scatter)); } } /// /// Utility shaders needed by a to operate. /// public class RayTracingResources { internal ComputeShader geometryPoolKernels { get; set; } internal ComputeShader copyBuffer { get; set; } internal ComputeShader copyPositions { get; set; } internal ComputeShader bitHistogram { get; set; } internal ComputeShader blockReducePart { get; set; } internal ComputeShader blockScan { get; set; } internal ComputeShader buildHlbvh { get; set; } internal ComputeShader restructureBvh { get; set; } internal ComputeShader scatter { get; set; } #if UNITY_EDITOR /// /// Intializes the RayTracingResources. /// /// /// This API works only in the Unity Editor, not at runtime. /// public void Load() { const string path = "Packages/com.unity.render-pipelines.core/Runtime/"; geometryPoolKernels = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute"); copyBuffer = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Common/Utilities/CopyBuffer.compute"); copyPositions = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute"); bitHistogram = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute"); blockReducePart = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute"); blockScan = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute"); buildHlbvh = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute"); restructureBvh = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute"); scatter = AssetDatabase.LoadAssetAtPath(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute"); } #endif #if ENABLE_ASSET_BUNDLE /// /// Intializes the RayTracingResources by loading its utility shaders from an AssetBundle. /// /// /// The necessary shaders are configured to belong to the unifiedraytracing AssetBundle which can be built by calling /// /// The AssetBundle to load the shaders from. public void LoadFromAssetBundle(AssetBundle assetBundle) { const string path = "Packages/com.unity.render-pipelines.core/Runtime/"; geometryPoolKernels = assetBundle.LoadAsset(path + "UnifiedRayTracing/Common/GeometryPool/GeometryPoolKernels.compute"); copyBuffer = assetBundle.LoadAsset(path + "UnifiedRayTracing/Common/Utilities/CopyBuffer.compute"); copyPositions = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/copyPositions.compute"); bitHistogram = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/bit_histogram.compute"); blockReducePart = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_reduce_part.compute"); blockScan = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/block_scan.compute"); buildHlbvh = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/build_hlbvh.compute"); restructureBvh = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/restructure_bvh.compute"); scatter = assetBundle.LoadAsset(path + "UnifiedRayTracing/Compute/RadeonRays/kernels/scatter.compute"); } #endif /// /// Intializes the RayTracingResources by loading its utility shaders via GraphicsSettings. /// /// /// This method only works in projects that use Scriptable Render Pipeline. /// /// Whether the resources were successfully loaded. public bool LoadFromRenderPipelineResources() { if (!GraphicsSettings.TryGetRenderPipelineSettings(out var rpResources)) return false; Debug.Assert(rpResources.GeometryPoolKernels != null); Debug.Assert(rpResources.CopyBuffer != null); Debug.Assert(rpResources.CopyPositions != null); Debug.Assert(rpResources.BitHistogram != null); Debug.Assert(rpResources.BlockReducePart != null); Debug.Assert(rpResources.BlockScan != null); Debug.Assert(rpResources.BuildHlbvh != null); Debug.Assert(rpResources.RestructureBvh != null); Debug.Assert(rpResources.Scatter != null); geometryPoolKernels = rpResources.GeometryPoolKernels; copyBuffer = rpResources.CopyBuffer; copyPositions = rpResources.CopyPositions; bitHistogram = rpResources.BitHistogram; blockReducePart = rpResources.BlockReducePart; blockScan = rpResources.BlockScan; buildHlbvh = rpResources.BuildHlbvh; restructureBvh = rpResources.RestructureBvh; scatter = rpResources.Scatter; return true; } } }