Files
UnrealEngine/Engine/Shaders/Private/RayTracing/RayTracingCommonMetal.ush
2025-05-18 13:04:45 +08:00

68 lines
2.9 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 MTLAccelerationStructureUserIDInstanceDescriptor:
struct FPlatformRayTracingInstanceDescriptor
{
float Transform[4][3]; // MTLPackedFloat4x3 transformationMatrix;
uint Options; // MTLAccelerationStructureInstanceOptions options;
uint InstanceMask; // uint32_t mask;
uint InstanceContributionToHitGroupIndex; // uint32_t intersectionFunctionTableOffset;
uint AccelerationStructure; // uint32_t accelerationStructureIndex;
uint InstanceID; // uint32_t userID;
};
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.InstanceID;
}
uint GetRayTracingInstanceDescriptorMask(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.InstanceMask;
}
uint GetRayTracingInstanceDescriptorInstanceContributionToHitGroupIndex(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.InstanceContributionToHitGroupIndex;
}
uint GetRayTracingInstanceDescriptorFlags(FPlatformRayTracingInstanceDescriptor Desc)
{
return Desc.Options;
}
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.x;
Desc.InstanceID = InstanceId;
SetRayTracingInstanceTransform(Desc, LocalToWorld);
return Desc;
}