---
title: Ray tracing with acceleration structures
framework: metal
role: collectionGroup
role_heading: API Collection
path: metal/ray-tracing-with-acceleration-structures
---

# Ray tracing with acceleration structures

Build a representation of your scene’s geometry using triangles and bounding volumes to quickly trace rays through the scene.

## Overview

Overview Ray tracing can improve your content’s realism by more accurately modeling the behavior of light than traditional rendering. You can also use ray tracing to implement similar techniques that rely on line-of-sight, such as sound obstruction or visually based AI functions. To apply ray tracing in your app: Create acceleration structures that represent objects in a scene. Define a ray’s behavior when it collides into parts of an acceleration structure by creating either intersectors or intersection queries. Generate rays into the scene from a new or existing shader. An intersector uses a table of your intersection functions that define the custom behavior for each intersection type. An intersection query returns to your calling function to handle the custom behavior for all intersection types. Intersectors work with compute kernels on all GPUs, and with render shaders only on Apple silicon GPUs. Alternatively, your app can use intersection queries on non-Apple GPUs, or for porting code from other graphics APIs.

## Topics

### Ray tracing samples

- [Accelerating ray tracing using Metal](metal/accelerating-ray-tracing-using-metal.md)
- [Control the ray tracing process using intersection queries](metal/control-the-ray-tracing-process-using-intersection-queries.md)
- [Rendering reflections in real time using ray tracing](metal/rendering-reflections-in-real-time-using-ray-tracing.md)
- [Rendering a curve primitive in a ray tracing scene](metal/rendering-a-curve-primitive-in-a-ray-tracing-scene.md)

### Acceleration structures

- [Improving ray-tracing data access using per-primitive data](metal/improving-ray-tracing-data-access-using-per-primitive-data.md)
- [MTLAccelerationStructure](metal/mtlaccelerationstructure.md)
- [MTL4AccelerationStructureDescriptor](metal/mtl4accelerationstructuredescriptor.md)
- [MTLAccelerationStructureDescriptor](metal/mtlaccelerationstructuredescriptor.md)
- [MTL4PrimitiveAccelerationStructureDescriptor](metal/mtl4primitiveaccelerationstructuredescriptor.md)
- [MTLPrimitiveAccelerationStructureDescriptor](metal/mtlprimitiveaccelerationstructuredescriptor.md)
- [MTL4InstanceAccelerationStructureDescriptor](metal/mtl4instanceaccelerationstructuredescriptor.md)
- [MTLInstanceAccelerationStructureDescriptor](metal/mtlinstanceaccelerationstructuredescriptor.md)
- [MTLAccelerationStructureCommandEncoder](metal/mtlaccelerationstructurecommandencoder.md)
- [MTLAccelerationStructureUsage](metal/mtlaccelerationstructureusage.md)
- [MTLAccelerationStructureRefitOptions](metal/mtlaccelerationstructurerefitoptions.md)

### Acceleration structures passes

- [MTLAccelerationStructurePassDescriptor](metal/mtlaccelerationstructurepassdescriptor.md)
- [MTLAccelerationStructurePassSampleBufferAttachmentDescriptor](metal/mtlaccelerationstructurepasssamplebufferattachmentdescriptor.md)
- [MTLAccelerationStructurePassSampleBufferAttachmentDescriptorArray](metal/mtlaccelerationstructurepasssamplebufferattachmentdescriptorarray.md)

### Geometry descriptors

- [MTL4AccelerationStructureGeometryDescriptor](metal/mtl4accelerationstructuregeometrydescriptor.md)
- [MTLAccelerationStructureGeometryDescriptor](metal/mtlaccelerationstructuregeometrydescriptor.md)
- [MTL4AccelerationStructureTriangleGeometryDescriptor](metal/mtl4accelerationstructuretrianglegeometrydescriptor.md)
- [MTLAccelerationStructureTriangleGeometryDescriptor](metal/mtlaccelerationstructuretrianglegeometrydescriptor.md)
- [MTL4AccelerationStructureCurveGeometryDescriptor](metal/mtl4accelerationstructurecurvegeometrydescriptor.md)
- [MTLAccelerationStructureCurveGeometryDescriptor](metal/mtlaccelerationstructurecurvegeometrydescriptor.md)
- [MTLCurveType](metal/mtlcurvetype.md)
- [MTLCurveBasis](metal/mtlcurvebasis.md)
- [MTLCurveEndCaps](metal/mtlcurveendcaps.md)
- [MTL4AccelerationStructureBoundingBoxGeometryDescriptor](metal/mtl4accelerationstructureboundingboxgeometrydescriptor.md)
- [MTLAccelerationStructureBoundingBoxGeometryDescriptor](metal/mtlaccelerationstructureboundingboxgeometrydescriptor.md)

### Motion geometry descriptors

- [MTL4AccelerationStructureMotionTriangleGeometryDescriptor](metal/mtl4accelerationstructuremotiontrianglegeometrydescriptor.md)
- [MTLAccelerationStructureMotionTriangleGeometryDescriptor](metal/mtlaccelerationstructuremotiontrianglegeometrydescriptor.md)
- [MTL4AccelerationStructureMotionCurveGeometryDescriptor](metal/mtl4accelerationstructuremotioncurvegeometrydescriptor.md)
- [MTLAccelerationStructureMotionCurveGeometryDescriptor](metal/mtlaccelerationstructuremotioncurvegeometrydescriptor.md)
- [MTL4AccelerationStructureMotionBoundingBoxGeometryDescriptor](metal/mtl4accelerationstructuremotionboundingboxgeometrydescriptor.md)
- [MTLAccelerationStructureMotionBoundingBoxGeometryDescriptor](metal/mtlaccelerationstructuremotionboundingboxgeometrydescriptor.md)
- [MTLMotionKeyframeData](metal/mtlmotionkeyframedata.md)

### Instance descriptors

- [MTLAccelerationStructureInstanceDescriptor](metal/mtlaccelerationstructureinstancedescriptor.md)
- [MTLAccelerationStructureUserIDInstanceDescriptor](metal/mtlaccelerationstructureuseridinstancedescriptor.md)
- [MTLAccelerationStructureMotionInstanceDescriptor](metal/mtlaccelerationstructuremotioninstancedescriptor.md)
- [MTLAccelerationStructureInstanceOptions](metal/mtlaccelerationstructureinstanceoptions.md)
- [MTL4IndirectInstanceAccelerationStructureDescriptor](metal/mtl4indirectinstanceaccelerationstructuredescriptor.md)
- [MTLIndirectInstanceAccelerationStructureDescriptor](metal/mtlindirectinstanceaccelerationstructuredescriptor.md)
- [MTLIndirectAccelerationStructureInstanceDescriptor](metal/mtlindirectaccelerationstructureinstancedescriptor.md)
- [MTLIndirectAccelerationStructureMotionInstanceDescriptor](metal/mtlindirectaccelerationstructuremotioninstancedescriptor.md)

### Intersection function tables

- [MTLIntersectionFunctionTable](metal/mtlintersectionfunctiontable.md)
- [MTLIntersectionFunctionTableDescriptor](metal/mtlintersectionfunctiontabledescriptor.md)
- [MTLIntersectionFunctionDescriptor](metal/mtlintersectionfunctiondescriptor.md)
- [MTLIntersectionFunctionSignature](metal/mtlintersectionfunctionsignature.md)
- [MTLIntersectionFunctionBufferArguments](metal/mtlintersectionfunctionbufferarguments.md)

### Supporting types

- [MTLAxisAlignedBoundingBox](metal/mtlaxisalignedboundingbox-swift.typealias.md)
- [MTLPackedFloat3](metal/mtlpackedfloat3-swift.typealias.md)
- [MTLPackedFloat4x3](metal/mtlpackedfloat4x3-swift.typealias.md)
- [MTLPackedFloat3Make(_:_:_:)](metal/mtlpackedfloat3make(_:_:_:).md)
- [MTL4BufferRange](metal/mtl4bufferrange.md)
- [MTL4BufferRangeMake(_:_:)](metal/mtl4bufferrangemake(_:_:).md)

## See Also

### Command encoders

- [Render passes](metal/render-passes.md)
- [Compute passes](metal/compute-passes.md)
- [Machine learning passes](metal/machine-learning-passes.md)
- [Blit passes](metal/blit-passes.md)
- [Indirect command encoding](metal/indirect-command-encoding.md)
