# RayTracingInstanceCullingMaterialTest

> This structure is used by RayTracingAccelerationStructure.CullInstances function to avoid adding Renderers to the acceleration structure or to ignore individual sub-meshes in a Mesh based on Shaders used by Materials when building the acceleration structure.

## Definition

* **Type:** Struct
* **Namespace:** [UnityEngine.Rendering](/engine/6000.6/script-reference/unityengine/rendering.md)
* **Assembly:** UnityEngine.CoreModule

```csharp
public struct RayTracingInstanceCullingMaterialTest
```

## Remarks

The Shader Tags and Shader Pass names defined in the Shader used by a Material are part of the test. The test passes when all the following conditions are met:

* `deniedShaderPasses` array is empty, or the Shader used by a Material doesn’t contain any of the Shader Passes from the array.
* `requiredShaderPasses` array is empty, or the Shader used by a Material contains a Shader Pass from the array. If the array is empty, `requiredShaderPasses` won't be used in the test.
* `requiredShaderPasses` and `deniedShaderPasses` arrays don't contain a valid Shader Pass at the same time.
* The Shader used by a Material doesn’t contain a Shader Pass included in `deniedShaderPasses` and `requiredShaderPasses` arrays at the same time.
* `requiredShaderTags` array is empty, or the Shader used by a Material contains at least one of the Shader Tags from the array.

Additional Resources: [RayTracingAccelerationStructure](/engine/6000.6/script-reference/unityengine/rendering/raytracingaccelerationstructure.md).

```csharp
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Rendering;

public class MaterialTestExample : MonoBehaviour
{
    private RayTracingAccelerationStructure rayTracingAccelStruct = null;

    void Start()
    {
        if (SystemInfo.supportsRayTracing == false)
        {
            Debug.Log("The system doesn't support Ray Tracing.");
            return;
        }

        RayTracingAccelerationStructure.Settings accelStructSettings = new RayTracingAccelerationStructure.Settings(RayTracingAccelerationStructure.ManagementMode.Manual, RayTracingAccelerationStructure.RayTracingModeMask.Everything, -1);
        rayTracingAccelStruct = new RayTracingAccelerationStructure(accelStructSettings);
    }

    void OnDisable()
    {
        if (rayTracingAccelStruct != null)
        {
            rayTracingAccelStruct.Release();
            rayTracingAccelStruct = null;
        }
    }

    RayTracingInstanceCullingConfig CreateDefaultValidRayTracingInstanceCullingConfig()
    {
        RayTracingInstanceCullingConfig cullingConfig = new RayTracingInstanceCullingConfig();

        cullingConfig.flags = RayTracingInstanceCullingFlags.None;

        cullingConfig.subMeshFlagsConfig.opaqueMaterials = RayTracingSubMeshFlags.Enabled | RayTracingSubMeshFlags.ClosestHitOnly;
        cullingConfig.subMeshFlagsConfig.transparentMaterials = RayTracingSubMeshFlags.Disabled;
        cullingConfig.subMeshFlagsConfig.alphaTestedMaterials = RayTracingSubMeshFlags.Enabled;

        List<RayTracingInstanceCullingTest> instanceTests = new List<RayTracingInstanceCullingTest>();
        RayTracingInstanceCullingTest instanceTest = new RayTracingInstanceCullingTest();
        instanceTest.allowTransparentMaterials = false;
        instanceTest.allowOpaqueMaterials = true;
        instanceTest.allowAlphaTestedMaterials = true;
        instanceTest.layerMask = -1;
        instanceTest.shadowCastingModeMask = (1 << (int)UnityEngine.Rendering.ShadowCastingMode.Off) | (1 << (int)UnityEngine.Rendering.ShadowCastingMode.On) | (1 << (int)UnityEngine.Rendering.ShadowCastingMode.TwoSided);
        instanceTest.instanceMask = 1 << 0;

        instanceTests.Add(instanceTest);
        cullingConfig.instanceTests = instanceTests.ToArray();

        return cullingConfig;
    }

    void LateUpdate()
    {
        if (rayTracingAccelStruct == null || Camera.main == null)
            return;

        RayTracingInstanceCullingConfig cullingConfig = CreateDefaultValidRayTracingInstanceCullingConfig();

        // SubShader tags requirements.
        cullingConfig.materialTest.requiredShaderTags = new RayTracingInstanceCullingShaderTagConfig[1];
        cullingConfig.materialTest.requiredShaderTags[0].tagId = new ShaderTagId("RenderMode");
        cullingConfig.materialTest.requiredShaderTags[0].tagValueId = new ShaderTagId("RayTracing");

        // Accept only Shaders that contain at least one of these Shader Passes.
        cullingConfig.materialTest.requiredShaderPasses = new string[] { "PathTracing", "RayTracedAO" };

        // Reject Shaders that contain any of these Shader Passes (for example shadow-only passes that should not be ray-traced).
        cullingConfig.materialTest.deniedShaderPasses = new string[] { "ShadowCaster" };

        rayTracingAccelStruct.ClearInstances();
        rayTracingAccelStruct.CullInstances(ref cullingConfig);

        rayTracingAccelStruct.Build();
    }
}
```

This is an example of how to create, populate and build an acceleration structure. The content of the acceleration structure is specified by configuring culling and filtering parameters that are passed to the CullInstances function. The required and denied Shader Passes are configured in /cullingConfig.materialTest/.

## Fields

| Value                                                                                                                                       | Description                                                                                                                                                                                                                                                                                           |
| ------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [deniedShaderPasses](/engine/6000.6/script-reference/unityengine/rendering/raytracinginstancecullingmaterialtest/deniedshaderpasses.md)     | An array of Shader Pass names used by [RayTracingAccelerationStructure.CullInstances](/engine/6000.6/script-reference/unityengine/rendering/raytracingaccelerationstructure/cullinstances.md) to ignore Renderers or individual sub-meshes.                                                           |
| [requiredShaderPasses](/engine/6000.6/script-reference/unityengine/rendering/raytracinginstancecullingmaterialtest/requiredshaderpasses.md) | An array of Shader Pass names used by [RayTracingAccelerationStructure.CullInstances](/engine/6000.6/script-reference/unityengine/rendering/raytracingaccelerationstructure/cullinstances.md) to accept Renderers or individual sub-meshes whose Shader contains at least one of these Shader Passes. |
| [requiredShaderTags](/engine/6000.6/script-reference/unityengine/rendering/raytracinginstancecullingmaterialtest/requiredshadertags.md)     | An array of Shader Tags used by [RayTracingAccelerationStructure.CullInstances](/engine/6000.6/script-reference/unityengine/rendering/raytracingaccelerationstructure/cullinstances.md) to ignore Renderers or individual sub-meshes.                                                                 |
