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

40 lines
2.0 KiB
HLSL

// Copyright Epic Games, Inc. All Rights Reserved.
/*=============================================================================
PositionReconstructionCommon.ush: utils functions used in multiple ray generation shaders
=============================================================================*/
#pragma once
float3 ReconstructTranslatedWorldPositionFromDeviceZ(uint2 PixelCoord, float DeviceZ)
{
float4 TranslatedWorldPosition = mul(float4(PixelCoord + 0.5, DeviceZ, 1), View.SVPositionToTranslatedWorld);
TranslatedWorldPosition.xyz /= TranslatedWorldPosition.w;
return TranslatedWorldPosition.xyz;
}
void ReconstructTranslatedWorldPositionAndCameraDirectionFromDeviceZ(uint2 PixelCoord, float DeviceZ, out float3 OutTranslatedWorldPosition, out float3 OutCameraDirection)
{
float4 TranslatedWorldPosition = mul(float4(PixelCoord + 0.5, DeviceZ, 1), View.SVPositionToTranslatedWorld);
TranslatedWorldPosition.xyz /= TranslatedWorldPosition.w;
OutTranslatedWorldPosition = TranslatedWorldPosition.xyz;
OutCameraDirection = GetCameraVectorFromTranslatedWorldPosition(TranslatedWorldPosition.xyz);
}
float3 ReconstructTranslatedWorldPositionFromDepth(float2 UV, float SceneDepth)
{
float2 ScreenPosition = (UV - View.ScreenPositionScaleBias.wz) / View.ScreenPositionScaleBias.xy;
float4 HomogeneousWorldPosition = mul(float4(GetScreenPositionForProjectionType(ScreenPosition, SceneDepth), SceneDepth, 1), PrimaryView.ScreenToTranslatedWorld);
float3 TranslatedWorldPosition = HomogeneousWorldPosition.xyz / HomogeneousWorldPosition.w;
return TranslatedWorldPosition;
}
float3 ReconstructWorldPositionFromDepth(float2 UV, float Depth)
{
float2 ScreenPosition = (UV - View.ScreenPositionScaleBias.wz) / View.ScreenPositionScaleBias.xy;
float4 HomogeneousWorldPosition = mul(float4(GetScreenPositionForProjectionType(ScreenPosition, Depth), Depth, 1), DFHackToFloat(PrimaryView.ScreenToWorld));
float3 WorldPosition = HomogeneousWorldPosition.xyz / HomogeneousWorldPosition.w;
return WorldPosition;
}