struct in UnityEngine.Rendering
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.
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.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.
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.
| Property | Description |
|---|---|
| deniedShaderPasses | An array of Shader Pass names used by RayTracingAccelerationStructure.CullInstances to ignore Renderers or individual sub-meshes. |
| requiredShaderPasses | An array of Shader Pass names used by RayTracingAccelerationStructure.CullInstances to accept Renderers or individual sub-meshes whose Shader contains at least one of these Shader Passes. |
| requiredShaderTags | An array of Shader Tags used by RayTracingAccelerationStructure.CullInstances to ignore Renderers or individual sub-meshes. |