Files
UnrealEngine/Engine/Shaders/Private/RayTracing/RayTracingCommonMetal.ush
Brandyn / Techy fcc1b09210 init
2026-04-04 15:40:51 -05:00

88 lines
3.2 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*==============================================================================
RayTracingCommonMetal.ush: Metal-specific ray tracing overrides.
==============================================================================*/
#pragma once
#define OVERRIDE_PLATFORM_RAYTRACING_INSTANCE_DESCRITOR 1
#define PLATFORM_RAYTRACING_INSTANCE_FLAG_NONE 0 // MTLAccelerationStructureInstanceOptionNone
#define PLATFORM_RAYTRACING_INSTANCE_FLAG_TRIANGLE_CULL_DISABLE 0x1 // MTLAccelerationStructureInstanceOptionDisableTriangleCulling
#define PLATFORM_RAYTRACING_INSTANCE_FLAG_TRIANGLE_FRONT_COUNTERCLOCKWISE 0x2 // MTLAccelerationStructureInstanceOptionTriangleFrontFacingWindingCounterClockwise
#define PLATFORM_RAYTRACING_INSTANCE_FLAG_FORCE_OPAQUE 0x4 // MTLAccelerationStructureInstanceOptionOpaque
#define PLATFORM_RAYTRACING_INSTANCE_FLAG_FORCE_NON_OPAQUE 0x8 // MTLAccelerationStructureInstanceOptionNonOpaque
// NOTE: Must be POD! (to avoid screwing up alignment for BLAS build).
// Mirrors IndirectAccelerationStructureInstanceDescriptor:
struct FPlatformRayTracingInstanceDescriptor
{
float Transform[4][3]; // MTLPackedFloat4x3 transformationMatrix;
uint Options; // MTLAccelerationStructureInstanceOptions options;
uint InstanceMask; // uint32_t mask;
uint InstanceContributionToHitGroupIndex; // uint32_t intersectionFunctionTableOffset;
uint InstanceID; // uint32_t userID;
uint2 AccelerationStructure; // uint2 accelerationStructureIndex;
uint GetInstanceId()
{
return InstanceID;
}
uint GetMask()
{
return InstanceMask;
}
uint GetInstanceContributionToHitGroupIndex()
{
return InstanceContributionToHitGroupIndex;
}
uint GetFlags()
{
return Options;
}
};
void SetRayTracingInstanceTransform(inout FPlatformRayTracingInstanceDescriptor Desc, float3x4 LocalToWorld)
{
for (uint j = 0; j < 4; j++)
for (uint i = 0; i < 3; i++)
Desc.Transform[j][i] = LocalToWorld[i][j];
}
uint GetRayTracingInstanceDescriptorInstanceId(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.GetInstanceId();
}
uint GetRayTracingInstanceDescriptorMask(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.GetMask();
}
uint GetRayTracingInstanceDescriptorInstanceContributionToHitGroupIndex(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.GetInstanceContributionToHitGroupIndex();
}
uint GetRayTracingInstanceDescriptorFlags(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.GetFlags();
}
FPlatformRayTracingInstanceDescriptor BuildPlatformRayTracingInstanceDesc(uint InstanceMask, uint InstanceId, uint InstanceFlags, uint InstanceContributionToHitGroupIndex, float3x4 LocalToWorld, uint2 AccelerationStructureAddress)
{
FPlatformRayTracingInstanceDescriptor Desc;
Desc.Options = InstanceFlags;
Desc.InstanceMask = InstanceMask;
Desc.InstanceContributionToHitGroupIndex = InstanceContributionToHitGroupIndex;
Desc.AccelerationStructure = AccelerationStructureAddress;
Desc.InstanceID = InstanceId;
SetRayTracingInstanceTransform(Desc, LocalToWorld);
return Desc;
}