40 lines
2.0 KiB
HLSL
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;
|
|
}
|