Skip to content

Commit 00c9099

Browse files
thomas-zengEvergreen
authored andcommitted
[Quest] URP XR Application Space Warp Support
Jira: https://jira.unity3d.com/browse/GFXFOUND-485 TDD: https://docs.google.com/document/d/1dcKIeihKJ4WfPnA3h1_5fhhouyfFGTlkRAzN8wLLI-4/edit#heading=h.e2arxtl9wukf - Users can enable App SpaceWarp for URP projects, in order to reduce the application’s rendering rate and increase the total frametime budget. ***Note***: ASW feature is only added to URP RenderGraph code path, Vulkan Graphics API - AppSW can be enabled when using the OpenXR plugin, and targeting the Vulkan graphics API when running URP RenderGraph. - Following shaders are modified to provide compatibility with AppSW - Lit - Unlit - SimpleLit - ComplexLit - ObjectMotionVectorFallback
1 parent 384c47b commit 00c9099

22 files changed

+693
-13
lines changed

Packages/com.unity.render-pipelines.core/Runtime/XR/XRGraphicsAutomatedTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ internal static void OverrideLayout(XRLayout layout, Camera camera)
7474
viewMatrix *= Matrix4x4.Translate(new Vector3(.34f, 0.25f, -0.08f));
7575
}
7676

77-
XRView xrView = new XRView(projMatrix, viewMatrix, xrPass.GetViewport(viewId), null, xrPass.GetTextureArraySlice(viewId));
77+
XRView xrView = new XRView(projMatrix, viewMatrix, Matrix4x4.identity, false, xrPass.GetViewport(viewId), null, xrPass.GetTextureArraySlice(viewId));
7878
xrPass.AssignView(viewId, xrView);
7979
}
8080
}

Packages/com.unity.render-pipelines.core/Runtime/XR/XRPass.cs

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,16 @@ public struct XRPassCreateInfo
1212
{
1313
internal RenderTargetIdentifier renderTarget;
1414
internal RenderTextureDescriptor renderTargetDesc;
15+
internal RenderTargetIdentifier motionVectorRenderTarget;
16+
internal RenderTextureDescriptor motionVectorRenderTargetDesc;
1517
internal ScriptableCullingParameters cullingParameters;
1618
internal Material occlusionMeshMaterial;
1719
internal float occlusionMeshScale;
1820
internal IntPtr foveatedRenderingInfo;
1921
internal int multipassId;
2022
internal int cullingPassId;
2123
internal bool copyDepth;
24+
internal bool hasMotionVectorPass;
2225

2326
#if ENABLE_VR && ENABLE_XR_MODULE
2427
internal UnityEngine.XR.XRDisplaySubsystem.XRRenderPass xrSdkRenderPass;
@@ -95,6 +98,11 @@ public bool supportsFoveatedRendering
9598
/// </summary>
9699
public bool copyDepth { get; private set; }
97100

101+
/// <summary>
102+
/// If true, the render pipeline is expected to generate motion data and output to the motionVectorRenderTarget.
103+
/// </summary>
104+
public bool hasMotionVectorPass { get; private set; }
105+
98106
/// <summary>
99107
/// If true, is the first pass of a xr camera
100108
/// </summary>
@@ -125,6 +133,16 @@ public bool supportsFoveatedRendering
125133
/// </summary>
126134
public RenderTextureDescriptor renderTargetDesc { get; private set; }
127135

136+
/// <summary>
137+
/// Destination render target for motion vectors
138+
/// </summary>
139+
public RenderTargetIdentifier motionVectorRenderTarget { get; private set; }
140+
141+
/// <summary>
142+
/// Destination render target descriptor for motion vectors.
143+
/// </summary>
144+
public RenderTextureDescriptor motionVectorRenderTargetDesc { get; private set; }
145+
128146
/// <summary>
129147
/// Parameters used for culling.
130148
/// </summary>
@@ -211,6 +229,26 @@ public Matrix4x4 GetViewMatrix(int viewIndex = 0)
211229
return m_Views[viewIndex].viewMatrix;
212230
}
213231

232+
/// <summary>
233+
/// Returns true if the previous frame view matrix for a given view is valid.
234+
/// </summary>
235+
/// <param name="viewIndex"> Index of XRView to retrieve the data from. </param>
236+
/// <returns> Boolean describing if previous frame view matrix for a given view is valid. </returns>
237+
public bool GetPrevViewValid(int viewIndex = 0)
238+
{
239+
return m_Views[viewIndex].isPrevViewMatrixValid;
240+
}
241+
242+
/// <summary>
243+
/// Returns the previous frame view matrix for a given view.
244+
/// </summary>
245+
/// <param name="viewIndex"> Index of XRView to retrieve the data from. </param>
246+
/// <returns> Previous frame XR view matrix for the specified XRView. </returns>
247+
public Matrix4x4 GetPrevViewMatrix(int viewIndex = 0)
248+
{
249+
return m_Views[viewIndex].prevViewMatrix;
250+
}
251+
214252
/// <summary>
215253
/// Returns the viewport for a given view.
216254
/// </summary>
@@ -422,6 +460,9 @@ public void InitBase(XRPassCreateInfo createInfo)
422460
AssignCullingParams(createInfo.cullingPassId, createInfo.cullingParameters);
423461
renderTarget = new RenderTargetIdentifier(createInfo.renderTarget, 0, CubemapFace.Unknown, -1);
424462
renderTargetDesc = createInfo.renderTargetDesc;
463+
motionVectorRenderTarget = new RenderTargetIdentifier(createInfo.motionVectorRenderTarget, 0, CubemapFace.Unknown, -1);
464+
motionVectorRenderTargetDesc = createInfo.motionVectorRenderTargetDesc;
465+
hasMotionVectorPass = createInfo.hasMotionVectorPass;
425466
m_OcclusionMesh.SetMaterial(createInfo.occlusionMeshMaterial);
426467
occlusionMeshScale = createInfo.occlusionMeshScale;
427468
foveatedRenderingInfo = createInfo.foveatedRenderingInfo;

Packages/com.unity.render-pipelines.core/Runtime/XR/XRSystem.cs

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -454,24 +454,30 @@ static XRView BuildView(XRDisplaySubsystem.XRRenderPass renderPass, XRDisplaySub
454454
// XRTODO : remove this line and use XRSettings.useOcclusionMesh instead when it's fixed
455455
Mesh occlusionMesh = XRGraphicsAutomatedTests.running ? null : renderParameter.occlusionMesh;
456456

457-
return new XRView(renderParameter.projection, renderParameter.view, viewport, occlusionMesh, renderParameter.textureArraySlice);
457+
return new XRView(renderParameter.projection, renderParameter.view, renderParameter.previousView, renderParameter.isPreviousViewValid, viewport, occlusionMesh, renderParameter.textureArraySlice);
458458
}
459459

460-
static XRPassCreateInfo BuildPass(XRDisplaySubsystem.XRRenderPass xrRenderPass, ScriptableCullingParameters cullingParameters, XRLayout layout)
460+
private static RenderTextureDescriptor XrRenderTextureDescToUnityRenderTextureDesc(RenderTextureDescriptor xrDesc)
461461
{
462462
// We can't use descriptor directly because y-flip is forced
463463
// XRTODO : fix root problem
464-
RenderTextureDescriptor xrDesc = xrRenderPass.renderTargetDesc;
465464
RenderTextureDescriptor rtDesc = new RenderTextureDescriptor(xrDesc.width, xrDesc.height, xrDesc.colorFormat, xrDesc.depthBufferBits, xrDesc.mipCount);
466-
rtDesc.dimension = xrRenderPass.renderTargetDesc.dimension;
467-
rtDesc.volumeDepth = xrRenderPass.renderTargetDesc.volumeDepth;
468-
rtDesc.vrUsage = xrRenderPass.renderTargetDesc.vrUsage;
469-
rtDesc.sRGB = xrRenderPass.renderTargetDesc.sRGB;
470-
465+
rtDesc.dimension = xrDesc.dimension;
466+
rtDesc.volumeDepth = xrDesc.volumeDepth;
467+
rtDesc.vrUsage = xrDesc.vrUsage;
468+
rtDesc.sRGB = xrDesc.sRGB;
469+
return rtDesc;
470+
}
471+
472+
static XRPassCreateInfo BuildPass(XRDisplaySubsystem.XRRenderPass xrRenderPass, ScriptableCullingParameters cullingParameters, XRLayout layout)
473+
{
471474
XRPassCreateInfo passInfo = new XRPassCreateInfo
472475
{
473476
renderTarget = xrRenderPass.renderTarget,
474-
renderTargetDesc = rtDesc,
477+
renderTargetDesc = XrRenderTextureDescToUnityRenderTextureDesc(xrRenderPass.renderTargetDesc),
478+
hasMotionVectorPass = xrRenderPass.hasMotionVectorPass,
479+
motionVectorRenderTarget = xrRenderPass.motionVectorRenderTarget,
480+
motionVectorRenderTargetDesc = XrRenderTextureDescToUnityRenderTextureDesc(xrRenderPass.motionVectorRenderTargetDesc),
475481
cullingParameters = cullingParameters,
476482
occlusionMeshMaterial = s_OcclusionMeshMaterial,
477483
occlusionMeshScale = GetOcclusionMeshScale(),

Packages/com.unity.render-pipelines.core/Runtime/XR/XRView.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,22 @@ internal readonly struct XRView
66
{
77
internal readonly Matrix4x4 projMatrix;
88
internal readonly Matrix4x4 viewMatrix;
9+
internal readonly Matrix4x4 prevViewMatrix;
910
internal readonly Rect viewport;
1011
internal readonly Mesh occlusionMesh;
1112
internal readonly int textureArraySlice;
1213
internal readonly Vector2 eyeCenterUV;
14+
internal readonly bool isPrevViewMatrixValid;
1315

14-
internal XRView(Matrix4x4 projMatrix, Matrix4x4 viewMatrix, Rect viewport, Mesh occlusionMesh, int textureArraySlice)
16+
internal XRView(Matrix4x4 projMatrix, Matrix4x4 viewMatrix, Matrix4x4 prevViewMatrix, bool isPrevViewMatrixValid, Rect viewport, Mesh occlusionMesh, int textureArraySlice)
1517
{
1618
this.projMatrix = projMatrix;
1719
this.viewMatrix = viewMatrix;
20+
this.prevViewMatrix = prevViewMatrix;
1821
this.viewport = viewport;
1922
this.occlusionMesh = occlusionMesh;
2023
this.textureArraySlice = textureArraySlice;
24+
this.isPrevViewMatrixValid = isPrevViewMatrixValid;
2125
eyeCenterUV = ComputeEyeCenterUV(projMatrix);
2226
}
2327

Packages/com.unity.render-pipelines.universal/Editor/ShaderScriptableStripper.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,12 +114,14 @@ public bool PassHasKeyword(LocalKeyword keyword)
114114
Shader m_ScreenSpaceLensFlareShader = Shader.Find("Hidden/Universal Render Pipeline/LensFlareScreenSpace");
115115
Shader m_XROcclusionMeshShader = Shader.Find("Hidden/Universal Render Pipeline/XR/XROcclusionMesh");
116116
Shader m_XRMirrorViewShader = Shader.Find("Hidden/Universal Render Pipeline/XR/XRMirrorView");
117+
Shader m_XRMotionVectorShader = Shader.Find("Hidden/Universal Render Pipeline/XR/XRMotionVector");
117118

118119
// Pass names
119120
public static readonly string kPassNameUniversal2D = "Universal2D";
120121
public static readonly string kPassNameGBuffer = "GBuffer";
121122
public static readonly string kPassNameForwardLit = "ForwardLit";
122123
public static readonly string kPassNameDepthNormals = "DepthNormals";
124+
public static readonly string kPassNameXRMotionVectors = "XRMotionVectors";
123125

124126
// Keywords
125127
LocalKeyword m_MainLightShadows;
@@ -719,6 +721,15 @@ internal bool StripUnusedFeatures_XROcclusionMesh(ref IShaderScriptableStripping
719721
return strippingData.stripUnusedXRVariants;
720722
}
721723

724+
internal bool StripUnusedFeatures_XRMotionVector(ref IShaderScriptableStrippingData strippingData)
725+
{
726+
if (strippingData.shader != m_XRMotionVectorShader)
727+
return false;
728+
729+
return strippingData.stripUnusedXRVariants;
730+
}
731+
732+
722733
internal bool StripUnusedFeatures(ref IShaderScriptableStrippingData strippingData)
723734
{
724735
if (StripUnusedFeatures_DebugDisplay(ref strippingData))
@@ -817,6 +828,9 @@ internal bool StripUnusedFeatures(ref IShaderScriptableStrippingData strippingDa
817828
if (StripUnusedFeatures_XROcclusionMesh(ref strippingData))
818829
return true;
819830

831+
if (StripUnusedFeatures_XRMotionVector(ref strippingData))
832+
return true;
833+
820834
return false;
821835
}
822836

@@ -991,6 +1005,14 @@ internal bool StripUnusedPass_Decals(ref IShaderScriptableStrippingData strippin
9911005
return false;
9921006
}
9931007

1008+
internal bool StripUnusedPass_XRMotionVectors(ref IShaderScriptableStrippingData strippingData)
1009+
{
1010+
// Strip XR MotionVector Passes if there is no XR
1011+
if (strippingData.passName == kPassNameXRMotionVectors && strippingData.stripUnusedXRVariants)
1012+
return true;
1013+
return false;
1014+
}
1015+
9941016
internal bool StripUnusedPass(ref IShaderScriptableStrippingData strippingData)
9951017
{
9961018
if (StripUnusedPass_2D(ref strippingData))
@@ -1005,6 +1027,9 @@ internal bool StripUnusedPass(ref IShaderScriptableStrippingData strippingData)
10051027
if (StripUnusedPass_Decals(ref strippingData))
10061028
return true;
10071029

1030+
if (StripUnusedPass_XRMotionVectors(ref strippingData))
1031+
return true;
1032+
10081033
return false;
10091034
}
10101035

0 commit comments

Comments
 (0)