RayTracingAccelerationStructure
класс в UnityEngine.Rendering
Выполнено в:UnityEngine.CoreModule
Описание
Структура пространственных данных оптимизирована для эффективного трассирования лучей на GPU.
RayTracingAccelerationStructure позволяет эффективно находить пересечения лучей с частью геометрии сцены средствами GPU. Это удобно, например, для реализации различных алгоритмов освещения. Этот класс применим только тогда, когда SystemInfo.supportsRayTracing это правда.
RayTracingAccelerationStructure конструктор принимает RayTracingAccelerationStructure.Settings, который можно использовать для настройки структуры ускорения. Например, RayTracingAccelerationStructure.Settings.rayTracingModeMask позволяет отфильтровать некоторые рендеры из структуры ускорения на основе RayTracingAccelerationStructure.Settings.managementMode, что дает вам возможность либо позволить Unity управлять содержимым структуры ускорения, либо управлять ими вручную. Вы можете использовать такие методы, как RayTracingAccelerationStructure.AddInstance, RayTracingAccelerationStructure.AddInstances, и RayTracingAccelerationStructure.RemoveInstance вручную добавлять и удалять экземпляры из структуры.
Вы можете повысить производительность трассирования лучей, включив в структуру ускорения меньше экземпляров. Например, вы можете исключить из структуры ускорения небольшие или удаленные объекты, поскольку они зачастую оказывают минимальное влияние на результаты. RayTracingAccelerationStructure.CullInstances добавить только те экземпляры, которые отвечают определенным критериям, описанным в RayTracingInstanceCullingConfig.
После изменения содержания RayTracingAccelerationStructure (например, путем вызова RayTracingAccelerationStructure.AddInstance) и прежде чем отправить какие-либо шейдеры, вы должны вызвать RayTracingAccelerationStructure.Build или CommandBuffer.BuildRayTracingAccelerationStructure чтобы выделить необходимые буферы и обновить внутреннее представление на GPU.
Как и другие ресурсы GPU, RayTracingAccelerationStructure Как это сделать, зависит от типа используемого шейдера. Для шейдеров с трассированием лучей вы можете использовать RayTracingShader.SetAccelerationStructure или CommandBuffer.SetRayTracingAccelerationStructure. Для вычисления шейдеров вы можете использовать ComputeShader.SetRayTracingAccelerationStructure или CommandBuffer.SetRayTracingAccelerationStructure. Наконец, вы можете использовать Shader.SetGlobalRayTracingAccelerationStructure и CommandBuffer.SetGlobalRayTracingAccelerationStructure сделать структуру ускорения глобально доступной для всех стадий шейдера (включая вершинные и фрагментные шейдеры).
Дополнительные ресурсы: CommandBuffer.SetRayTracingAccelerationStructure, RayTracingShader.SetAccelerationStructure.
// This snippet shows how to create a RayTracingAccelerationStructure and pass it to // a ComputeShader. The compute shader is invoked once per screen pixel. For example, // this could be used to implement ray traced shadows.
using UnityEngine; using UnityEngine.Rendering;
[ExecuteInEditMode] public class RayTracingExample : MonoBehaviour { public ComputeShader computeShader;
private RenderTexture outputTexture; private RayTracingAccelerationStructure rtas; private int kernelIndex = -1; private uint kernelThreadGroupSizeX; private uint kernelThreadGroupSizeY; private uint kernelThreadGroupSizeZ;
void OnDisable() { ReleaseResources(); }
private void Update() { if (!SystemInfo.supportsInlineRayTracing) { Debug.Log("Ray Queries (inline ray tracing) is not supported by this GPU or by the current graphics API."); return; } if (computeShader == null) { Debug.Log("Please assign a compute shader."); return; }
CreateResourcesIfNeeded(Camera.main.pixelWidth, Camera.main.pixelHeight);
CommandBuffer cmd = new CommandBuffer(); cmd.BuildRayTracingAccelerationStructure(rtas); cmd.SetRayTracingAccelerationStructure(computeShader, kernelIndex, "g_AccelStruct", rtas); // Set more inputs here. cmd.SetComputeTextureParam(computeShader, kernelIndex, "g_Output", outputTexture); cmd.DispatchCompute(computeShader, kernelIndex, (int)((outputTexture.width + kernelThreadGroupSizeX + 1) / kernelThreadGroupSizeX),(int)((outputTexture.height + kernelThreadGroupSizeY + 1) / kernelThreadGroupSizeY), 1);
Graphics.ExecuteCommandBuffer(cmd); }
private void CreateResourcesIfNeeded(int width, int height) { if (rtas == null) { RayTracingAccelerationStructure.Settings settings = new RayTracingAccelerationStructure.Settings(); settings.rayTracingModeMask = RayTracingAccelerationStructure.RayTracingModeMask.Everything; settings.managementMode = RayTracingAccelerationStructure.ManagementMode.Automatic; settings.layerMask = 255;
rtas = new RayTracingAccelerationStructure(settings); }
if (outputTexture == null || outputTexture.width != width || outputTexture.height != height) { if (outputTexture) outputTexture.Release();
outputTexture = new RenderTexture(width, height, 0, RenderTextureFormat.RHalf); outputTexture.enableRandomWrite = true; outputTexture.Create(); }
if (kernelIndex == -1) { kernelIndex = computeShader.FindKernel("CSMain"); Debug.Assert(kernelIndex != -1, "Kernel not found."); Debug.Assert(computeShader.IsSupported(kernelIndex), "Compute shader " + computeShader.name + " failed to compile or is not supported."); computeShader.GetKernelThreadGroupSizes(kernelIndex, out kernelThreadGroupSizeX, out kernelThreadGroupSizeY, out kernelThreadGroupSizeZ); } }
private void ReleaseResources() { if (rtas != null) rtas.Release();
if (outputTexture != null) outputTexture.Release();
rtas = null; outputTexture = null; kernelIndex = -1; } }
Конструкторы
| Конструктор | Описание |
|---|---|
| RayTracingAccelerationStructure | Создает RayTracingAccelerationStructure с заданным RayTracingAccelerationStructure.Settings. |
Открытые методы
| Метод | Описание |
|---|---|
| AddInstance | Добавление экземпляра трассировки лучей в RayTracingAccelerationStructure. |
| AddInstances | Добавляет массив экземпляров Mesh с трассировкой лучей в RayTracingAccelerationStructure. |
| AddInstancesIndirect | Добавляет массив экземпляров трассирования лучей в структуру ускорения, где матрицы экземпляров заданы с помощью GraphicsBuffer. |
| AddVFXInstances | Добавление экземпляров трассирования лучей, связанных с VFXRenderer, в RayTracingAccelerationStructure. |
| Build | Создает структуры ускорения на GPU. Выделяет любую GPU память, необходимую для хранения данных структур ускорения. |
| ClearInstances | Удаляет все экземпляры трассировки лучей из RayTracingAccelerationStructure. |
| CullInstances | Заполняет RayTracingAccelerationStructure экземплярами трассировки лучей, которые Unity связывает с рендерерами в Scene с помощью параметров фильтрации и отбора. |
| Dispose | Уничтожает RayTracingAccelerationStructure и высвобождает GPU память, используемую для хранения данных структуры ускорения. |
| GetInstanceCount | Возвращает число экземпляров трассировки лучей в RayTracingAccelerationStructure. |
| GetSize | Возвращает общий размер этого RayTracingAccelerationStructure в памяти GPU в байтах. |
| Release | Уничтожает RayTracingAccelerationStructure и высвобождает GPU память, используемую для хранения данных структуры ускорения. |
| RemoveInstance | Удаляет экземпляр трассировки лучей, связанный с Renderer из этого RayTracingAccelerationStructure. |
| RemoveInstances | Удаляет экземпляры трассировки лучей из RayTracingAccelerationStructure с помощью фильтрации по слою и RayTracingMode. |
| RemoveVFXInstances | Удаляет экземпляры трассировки лучей, связанные с VFXRenderer из RayTracingAccelerationStructure. |
| UpdateInstanceGeometry | Помечает геометрию экземпляра трассирования лучей как грязную. |
| UpdateInstanceID | Обновляет экземпляр ID экземпляра трассировки лучей. |
| UpdateInstanceMask | Обновляет маску экземпляра экземпляра трассировки лучей. |
| UpdateInstancePropertyBlock | Обновления для каждого экземпляра лучевых трасс Свойства материала. |
| UpdateInstanceTransform | Обновляет преобразование экземпляра трассировки лучей. |