68 lines
2.9 KiB
HLSL
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;
|
|
}
|