Files
UnrealEngineUWP/Engine/Shaders/Private/PositionReconstructionCommon.ush
wouter dek 8f310241b2 Use DoubleFloat instead of tile+offset in various systems on GPU to improve numerical precision.
#jira UE-171685
#rb Charles.deRousiers, tim.doerries

[CL 30763421 by wouter dek in ue5-main branch]
2024-01-21 21:02:35 -05:00

40 lines
2.0 KiB
Plaintext

// 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;
}