Unity 6.3
0 онлайн 76 гостей 3 в системе
Вход

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Обновляет преобразование экземпляра трассировки лучей.