From 4e1c22d1e3e670972d9961a17fa0853b0bce27d0 Mon Sep 17 00:00:00 2001 From: Kleber Garcia Date: Tue, 14 Sep 2021 10:50:54 -0400 Subject: [PATCH 1/2] Celestial relative flare camera position fixed, using regular matrices instead to fix precision issues --- .../PostProcessing/LensFlareCommonSRP.cs | 31 ++++++++++++++++--- 1 file changed, 27 insertions(+), 4 deletions(-) diff --git a/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs b/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs index 5f464cf7621..021f4935580 100644 --- a/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs +++ b/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs @@ -272,7 +272,19 @@ static Vector2 GetLensFlareRayOffset(Vector2 screenPos, float position, float gl globalSin0 * rayOff.x + globalCos0 * rayOff.y); } - static Vector3 WorldToViewport(bool isCameraRelative, Matrix4x4 viewProjMatrix, Vector3 cameraPosWS, Vector3 positionWS) + static Vector3 WorldToViewport(Camera camera, bool isLocalLight, bool isCameraRelative, Matrix4x4 viewProjMatrix, Vector3 positionWS) + { + if (isLocalLight && isCameraRelative) + { + return WorldToViewportLocal(isCameraRelative, viewProjMatrix, camera.transform.position, positionWS); + } + else + { + return WorldToViewportDistance(camera, positionWS); + } + } + + static Vector3 WorldToViewportLocal(bool isCameraRelative, Matrix4x4 viewProjMatrix, Vector3 cameraPosWS, Vector3 positionWS) { Vector3 localPositionWS = positionWS; if (isCameraRelative) @@ -286,7 +298,18 @@ static Vector3 WorldToViewport(bool isCameraRelative, Matrix4x4 viewProjMatrix, viewportPos.y = viewportPos.y * 0.5f + 0.5f; viewportPos.y = 1.0f - viewportPos.y; viewportPos.z = viewportPos4.w; + return viewportPos; + } + static Vector3 WorldToViewportDistance(Camera cam, Vector3 positionWS) + { + Vector4 camPos = cam.worldToCameraMatrix * positionWS; + Vector4 viewportPos4 = cam.projectionMatrix * camPos; + Vector3 viewportPos = new Vector3(viewportPos4.x, viewportPos4.y, 0f); + viewportPos /= viewportPos4.w; + viewportPos.x = viewportPos.x * 0.5f + 0.5f; + viewportPos.y = viewportPos.y * 0.5f + 0.5f; + viewportPos.z = viewportPos4.w; return viewportPos; } @@ -386,7 +409,7 @@ static public void DoLensFlareDataDrivenCommon(Material lensFlareShader, LensFla positionWS = comp.transform.position; } - viewportPos = WorldToViewport(isCameraRelative, viewProjMatrix, cam.transform.position, positionWS); + viewportPos = WorldToViewport(cam, !isDirLight, isCameraRelative, viewProjMatrix, positionWS); if (usePanini && cam == Camera.main) { @@ -421,9 +444,9 @@ static public void DoLensFlareDataDrivenCommon(Material lensFlareShader, LensFla globalColorModulation *= distanceAttenuation; Vector3 dir = (cam.transform.position - comp.transform.position).normalized; - Vector3 screenPosZ = WorldToViewport(isCameraRelative, viewProjMatrix, cam.transform.position, positionWS + dir * comp.occlusionOffset); + Vector3 screenPosZ = WorldToViewport(cam, !isDirLight, isCameraRelative, viewProjMatrix, positionWS + dir * comp.occlusionOffset); Vector2 occlusionRadiusEdgeScreenPos0 = (Vector2)viewportPos; - Vector2 occlusionRadiusEdgeScreenPos1 = (Vector2)WorldToViewport(isCameraRelative, viewProjMatrix, cam.transform.position, positionWS + cam.transform.up * comp.occlusionRadius); + Vector2 occlusionRadiusEdgeScreenPos1 = (Vector2)WorldToViewport(cam, !isDirLight, isCameraRelative, viewProjMatrix, positionWS + cam.transform.up * comp.occlusionRadius); float occlusionRadius = (occlusionRadiusEdgeScreenPos1 - occlusionRadiusEdgeScreenPos0).magnitude; cmd.SetGlobalVector(_FlareData1, new Vector4(occlusionRadius, comp.sampleCount, screenPosZ.z, actualHeight / actualWidth)); From e21a27decd4394002eac6711ce40088677776723 Mon Sep 17 00:00:00 2001 From: Kleber Garcia Date: Tue, 14 Sep 2021 11:04:34 -0400 Subject: [PATCH 2/2] Fix in logical split of viewport computation, and adding CHANGES.md info for lensflare --- com.unity.render-pipelines.core/CHANGELOG.md | 1 + .../Runtime/PostProcessing/LensFlareCommonSRP.cs | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/com.unity.render-pipelines.core/CHANGELOG.md b/com.unity.render-pipelines.core/CHANGELOG.md index d128a3bb6f6..e981f956407 100644 --- a/com.unity.render-pipelines.core/CHANGELOG.md +++ b/com.unity.render-pipelines.core/CHANGELOG.md @@ -84,6 +84,7 @@ The version number for this package has increased due to a version update of a r - Fixed Lens Flare 'radialScreenAttenuationCurve invisible' - Fixed Lens Flare rotation for Curve Distribution - Fixed potentially conflicting runtime Rendering Debugger UI command by adding an option to disable runtime UI altogether (1345783). +- Fixed Lens Flare position for celestial at very far camera distances. It now locks correctly into the celestial position regardless of camera distance (1363291) ### Changed - Improved the warning messages for Volumes and their Colliders. diff --git a/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs b/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs index 021f4935580..5edc17caa41 100644 --- a/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs +++ b/com.unity.render-pipelines.core/Runtime/PostProcessing/LensFlareCommonSRP.cs @@ -274,7 +274,7 @@ static Vector2 GetLensFlareRayOffset(Vector2 screenPos, float position, float gl static Vector3 WorldToViewport(Camera camera, bool isLocalLight, bool isCameraRelative, Matrix4x4 viewProjMatrix, Vector3 positionWS) { - if (isLocalLight && isCameraRelative) + if (isLocalLight) { return WorldToViewportLocal(isCameraRelative, viewProjMatrix, camera.transform.position, positionWS); }