# RayTracingAccelerationStructure

> Spatial data structure optimized for efficient ray tracing on the GPU.

## Definition

* **Type:** Class
* **Namespace:** [UnityEngine.Rendering](/engine/6000.5/script-reference/unityengine/rendering.md)
* **Assembly:** UnityEngine.CoreModule
* **Implements:** [IDisposable](https://learn.microsoft.com/dotnet/api/system.idisposable)

```csharp
public sealed class RayTracingAccelerationStructure : IDisposable
```

## Remarks

[RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md) enables you to efficiently intersect rays against a subset of the Scene geometry using the GPU. This can be useful to implement various lighting algorithms, for example. This class only applies when [SystemInfo.supportsRayTracing](/engine/6000.5/script-reference/unityengine/systeminfo/supportsraytracing.md) is true.

The [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md) constructor takes a [RayTracingAccelerationStructure.Settings](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings.md) that you can use to configure the acceleration structure. For example, [RayTracingAccelerationStructure.Settings.rayTracingModeMask](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings/raytracingmodemask.md) lets you filter out certain Renderers from the acceleration structure based on [RayTracingAccelerationStructure.Settings.managementMode](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings/managementmode.md), which gives you the option to either let Unity manage the contents of the acceleration structure or handle them manually yourself. You can use methods like [RayTracingAccelerationStructure.AddInstance](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstance.md), [RayTracingAccelerationStructure.AddInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstances.md), and [RayTracingAccelerationStructure.RemoveInstance](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/removeinstance.md) to manually add and remove instances from the structure.

You can improve ray tracing performance by including fewer instances in the acceleration structure. For example, you can exclude small or distant objects from the acceleration structure as they often have minimal impact on results. You can use [RayTracingAccelerationStructure.CullInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/cullinstances.md) to add only the instances which match certain criteria described in [RayTracingInstanceCullingConfig](/engine/6000.5/script-reference/unityengine/rendering/raytracinginstancecullingconfig.md).

After modifying the contents of a [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md) (for example by calling [RayTracingAccelerationStructure.AddInstance](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstance.md)) and before dispatching any shaders, you must call [RayTracingAccelerationStructure.Build](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/build.md) or [CommandBuffer.BuildRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/commandbuffer/buildraytracingaccelerationstructure.md) to allocate necessary buffers and update the internal GPU representation.

Like other GPU resources, [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md) instances must explicitly be passed to shaders. How to do this depends on what type of shader you're using. For Ray Tracing Shaders you can use [RayTracingShader.SetAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingshader/setaccelerationstructure.md) or [CommandBuffer.SetRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/commandbuffer/setraytracingaccelerationstructure.md). For Compute Shaders you can use [ComputeShader.SetRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/computeshader/setraytracingaccelerationstructure.md) or [CommandBuffer.SetRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/commandbuffer/setraytracingaccelerationstructure.md). Finally, you can use [Shader.SetGlobalRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/shader/setglobalraytracingaccelerationstructure.md) and [CommandBuffer.SetGlobalRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/commandbuffer/setglobalraytracingaccelerationstructure.md) to make an acceleration structure globally available for all shader stages (including vertex and fragment shaders).

Additional Resources: [CommandBuffer.SetRayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/commandbuffer/setraytracingaccelerationstructure.md), [RayTracingShader.SetAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingshader/setaccelerationstructure.md).

## Examples

```csharp
// 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;
    }
}
```

## Constructors

| Constructor                                                                                                                                                                                                                                  | Description                                                                                                                                                                                             |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [RayTracingAccelerationStructure()](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/ctor.md#raytracingaccelerationstructure\(\))                                                                       | Creates a RayTracingAccelerationStructure with the given [RayTracingAccelerationStructure.Settings](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings.md). |
| [RayTracingAccelerationStructure(UnityEngine.Rendering.RayTracingAccelerationStructure.Settings)](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/ctor.md#raytracingaccelerationstructure\(settings\)) | Creates a RayTracingAccelerationStructure with the given [RayTracingAccelerationStructure.Settings](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings.md). |

## Methods

| Method                                                                                                                                              | Description                                                                                                                                                                                                                                                                                                                                            |
| --------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [AddInstance](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstance.md)                                 | Adds a ray tracing instance to the RayTracingAccelerationStructure.                                                                                                                                                                                                                                                                                    |
| [AddInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstances.md)                               | Adds an array of ray tracing Mesh instances to the RayTracingAccelerationStructure.                                                                                                                                                                                                                                                                    |
| [AddInstancesIndirect](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addinstancesindirect.md)               | Adds an array of ray tracing instances to the acceleration structure where the instance matrices are specified using a GraphicsBuffer.                                                                                                                                                                                                                 |
| [AddVFXInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/addvfxinstances.md)                         | Adds the ray tracing instances associated with a VFXRenderer to the RayTracingAccelerationStructure.                                                                                                                                                                                                                                                   |
| [Build](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/build.md)                                             | Builds acceleration structures on the GPU. Allocates any GPU memory required for storing acceleration structure data.                                                                                                                                                                                                                                  |
| [ClearInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/clearinstances.md)                           | Removes all ray tracing instances from the RayTracingAccelerationStructure.                                                                                                                                                                                                                                                                            |
| [CullInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/cullinstances.md)                             | Populates the RayTracingAccelerationStructure with ray tracing instances that Unity associates with Renderers in the Scene by using filtering and culling parameters.                                                                                                                                                                                  |
| [Dispose](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/dispose.md)                                         | Destroys this RayTracingAccelerationStructure and frees the GPU memory used for storing acceleration structure data.                                                                                                                                                                                                                                   |
| [GetInstanceCount](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/getinstancecount.md)                       | Returns the number of ray tracing instances in the RayTracingAccelerationStructure.                                                                                                                                                                                                                                                                    |
| [GetNativeBufferPtr](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/getnativebufferptr.md)                   | Returns a native pointer to the top-level acceleration structure (TLAS) buffer as it is represented in the native graphics API, for example an `ID3D12Resource`.                                                                                                                                                                                       |
| [GetSize](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/getsize.md)                                         | Returns the total size of this RayTracingAccelerationStructure in GPU memory in bytes.                                                                                                                                                                                                                                                                 |
| [Release](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/release.md)                                         | Destroys this RayTracingAccelerationStructure and frees the GPU memory used for storing acceleration structure data.                                                                                                                                                                                                                                   |
| [RemoveInstance](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/removeinstance.md)                           | Removes a ray tracing instance associated with an axis-aligned bounding box (AABBs) [GraphicsBuffer](/engine/6000.5/script-reference/unityengine/graphicsbuffer.md) or a [Mesh](/engine/6000.5/script-reference/unityengine/mesh.md) instance from this RayTracingAccelerationStructure.                                                               |
| [RemoveInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/removeinstances.md)                         | Removes ray tracing instances from the [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md) using filtering based on layer and [RayTracingMode](/engine/6000.5/script-reference/unityengine/experimental/rendering/raytracingmode.md).                                          |
| [RemoveVFXInstances](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/removevfxinstances.md)                   | Removes the ray tracing instances associated with a [VFXRenderer](/engine/6000.5/script-reference/unityengine/vfx/vfxrenderer.md) from the [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md).                                                                                |
| [UpdateInstanceGeometry](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/updateinstancegeometry.md)           | Only ray tracing instances that use [RayTracingMode.DynamicGeometryManualUpdate](/engine/6000.5/script-reference/unityengine/experimental/rendering/raytracingmode/dynamicgeometrymanualupdate.md) can use this function to update their geometry. The function doesn't have any effects on ray tracing instances using procedural geometries (AABBs). |
| [UpdateInstanceID](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/updateinstanceid.md)                       | Updates the instance ID of a ray tracing instance.                                                                                                                                                                                                                                                                                                     |
| [UpdateInstanceMask](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/updateinstancemask.md)                   | Updates the instance mask of a ray tracing instance.                                                                                                                                                                                                                                                                                                   |
| [UpdateInstancePropertyBlock](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/updateinstancepropertyblock.md) | Updates per ray tracing instance Material properties.                                                                                                                                                                                                                                                                                                  |
| [UpdateInstanceTransform](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/updateinstancetransform.md)         | Updates the transformation of a ray tracing instance.                                                                                                                                                                                                                                                                                                  |

## Structs

| Struct                                                                                                                                                  | Description                                                                                                                                                  |
| ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [RayTracingAccelerationStructure.BuildSettings](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/buildsettings.md) | Contains options for building a [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md). |
| [RayTracingAccelerationStructure.Settings](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/settings.md)           | Defines whether Unity or the user updates a RayTracingAccelerationStructure. Also provides additional filtering and acceleration structure build options.    |

## Enums

| Enum                                                                                                                                                              | Description                                                                                                                                                                                                                         |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [RayTracingAccelerationStructure.ManagementMode](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/managementmode.md)         | Defines whether Unity updates a RayTracingAccelerationStructure automatically, or if the user updates it manually via API.                                                                                                          |
| [RayTracingAccelerationStructure.RayTracingModeMask](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure/raytracingmodemask.md) | Flags that determine which RayTracingModes ray tracing instances must have in order to be added to the [RayTracingAccelerationStructure](/engine/6000.5/script-reference/unityengine/rendering/raytracingaccelerationstructure.md). |
