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

125 lines
3.0 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
#pragma once
#include "../RayTracing/RayTracingCommon.ush"
#include "/Engine/Shared/LumenDefinitions.h"
struct FLumenRayHitBookmark
{
uint2 PackedData;
};
#define LUMEN_RAYHIT_BOOKMARK_MISS 0xFFFFFFFF
#define MATERIAL_INDEX 0
#define NORMAL_INDEX 1
#define GPU_SCENE_INSTANCE_INDEX 2
// #lumen_todo: Pack more aggressively. HitT - 2 bytes, GPUSceneIndex - 3 bytes, MaterialIndex - 3 bytes
struct FLumenMinimalPayload : FMinimalPayload
{
uint PackedData[3];
void SetIsTranslucent(uint bIsTranslucent)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0x7FFFFFFF) | ((bIsTranslucent & 0x01) << 31);
}
uint IsTranslucent()
{
uint bIsTranslucent = (PackedData[MATERIAL_INDEX] >> 31) & 0x1;
return bIsTranslucent;
}
void SetIsTwoSided(uint bIsTwoSided)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xBFFFFFFF) | ((bIsTwoSided & 0x01) << 30);
}
uint IsTwoSided()
{
uint bIsTwoSided = (PackedData[MATERIAL_INDEX] >> 30) & 0x1;
return bIsTwoSided;
}
void SetIsShadowRay(uint bIsShadowRay)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xDFFFFFFF) | ((bIsShadowRay & 0x01) << 29);
}
uint IsShadowRay()
{
uint bIsShadowRay = (PackedData[MATERIAL_INDEX] >> 29) & 0x1;
return bIsShadowRay;
}
void SetIsAlphaMasked(uint bIsAlphaMasked)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xEFFFFFFF) | ((bIsAlphaMasked & 0x01) << 28);
}
uint IsAlphaMasked()
{
uint bIsAlphaMasked = (PackedData[MATERIAL_INDEX] >> 28) & 0x1;
return bIsAlphaMasked;
}
void SetFrontFace(bool bFrontFace)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xF7FFFFFF) | ((bFrontFace ? 1u : 0u) << 27);
}
uint IsFrontFace()
{
uint bIsTwoSided = (PackedData[MATERIAL_INDEX] >> 27) & 0x1;
return bIsTwoSided;
}
void SetIsDynamicGeometry(uint bIsDynamicGoeometry)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xFBFFFFFF) | ((bIsDynamicGoeometry ? 1u : 0u) << 26);
}
uint IsDynamicGeometry()
{
uint bIsDynamicGeometry = (PackedData[MATERIAL_INDEX] >> 26) & 0x1;
return bIsDynamicGeometry;
}
void SetMaterialShaderIndex(uint MaterialShaderIndex)
{
PackedData[MATERIAL_INDEX] = (PackedData[MATERIAL_INDEX] & 0xFF800000) | (MaterialShaderIndex & LUMEN_MATERIAL_SHADER_INDEX_MASK);
}
uint GetMaterialShaderIndex()
{
uint MaterialShaderIndex = PackedData[MATERIAL_INDEX] & LUMEN_MATERIAL_SHADER_INDEX_MASK;
return MaterialShaderIndex;
}
void SetWorldNormal(float3 WorldNormal)
{
PackedData[NORMAL_INDEX] = PackNormalToUInt32(WorldNormal);
}
float3 GetWorldNormal()
{
return UnpackNormalFromUInt32(PackedData[NORMAL_INDEX]);
}
void SetGPUSceneInstanceIndex(uint GPUSceneInstanceIndex)
{
PackedData[GPU_SCENE_INSTANCE_INDEX] = GPUSceneInstanceIndex;
}
uint GetGPUSceneInstanceIndex()
{
return asint(PackedData[GPU_SCENE_INSTANCE_INDEX]);
}
};
#if IS_PAYLOAD_ENABLED(RT_PAYLOAD_TYPE_LUMEN_MINIMAL)
CHECK_RT_PAYLOAD_SIZE(FLumenMinimalPayload)
#endif