Files
UnrealEngineUWP/Engine/Shaders/Private/PositionReconstructionCommon.ush
tiago costa 1722da7465 Raytracing in translated world space
- Raytracing shadows/reflections/AO/GI/etc and path tracer now work in large worlds.
- Updated parts of Lumen using raytracing to work in large worlds.
- This change doesn't not address (all) GPU Lightmass issues in large worlds.

Changes:
- Build TLAS with instances in translated world space.
- Move ray origin to translated world space.
- Updated raytracing shaders to use translated world space (most LWCHackToFloat in these shaders are now gone).
- Store gather points positions in translated world space.
- Removed unused RayTracingDynamicMeshVS(...)

#rb Yuriy.ODonnell, Patrick.Kelly, chris.kulla, rob.krajcarski
#jira UE-140558
#preflight 620bb3ff4353dc61c7f51e64

[CL 18995354 by tiago costa in ue5-main branch]
2022-02-15 09:20:03 -05:00

40 lines
1.9 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 = normalize(TranslatedWorldPosition.xyz - View.TranslatedWorldCameraOrigin);
}
float3 ReconstructTranslatedWorldPositionFromDepth(float2 UV, float SceneDepth)
{
float2 ScreenPosition = (UV - View.ScreenPositionScaleBias.wz) / View.ScreenPositionScaleBias.xy;
float4 HomogeneousWorldPosition = mul(float4(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(ScreenPosition * Depth, Depth, 1), LWCHackToFloat(PrimaryView.ScreenToWorld));
float3 WorldPosition = HomogeneousWorldPosition.xyz / HomogeneousWorldPosition.w;
return WorldPosition;
}