From 73626cb4d76e730c863d846f9e8d94220df630d1 Mon Sep 17 00:00:00 2001 From: StarBeats <977663818@qq.com> Date: Fri, 3 Jan 2025 17:57:09 +0800 Subject: [PATCH] use vrs --- .../Runtime/Passes/DrawObjectsPass.cs | 93 ++++++++++++++----- ProjectSettings/TagManager.asset | 4 +- 2 files changed, 72 insertions(+), 25 deletions(-) diff --git a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs index 555e79d..5e2d841 100644 --- a/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs +++ b/Packages/com.unity.render-pipelines.universal@14.0.11/Runtime/Passes/DrawObjectsPass.cs @@ -250,8 +250,9 @@ namespace UnityEngine.Rendering.Universal.Internal } else { + var useDx12 = SystemInfo.graphicsDeviceType == GraphicsDeviceType.Direct3D12; var asset = UniversalRenderPipeline.asset; - if(asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) + void EnableVrs(CommandBuffer cmd, bool useDx12, in RenderingData renderingData, UniversalRenderPipelineAsset asset) { #if PLATFORM_IOS || UNITY_STANDALONE_OSX DataPack* ptr = (DataPack*)vrsDataPackPtr.ToPointer(); @@ -294,40 +295,86 @@ namespace UnityEngine.Rendering.Universal.Internal cmd.BeginSample("EnableVrs"); cmd.IssuePluginEventAndData(RenderingPlugin.GetRenderEventAndDataFunc(), (int)RenderingPlugin.NativeRenderingEvent.EnableVRS, vrsDataPackPtr); #else + cmd.BeginSample("EnableVrs"); *(int*)vrsEnumPtr.ToPointer() = (int)asset.VRSRate; cmd.IssuePluginEventAndData(RenderingPlugin.GetRenderEventAndDataFunc(), (int)RenderingPlugin.NativeRenderingEvent.EnableVRS, vrsEnumPtr); - context.ExecuteCommandBuffer(cmd); - cmd.Clear(); #endif cmd.EndSample("EnableVrs"); - -#if DX12 - // DX12 下会 context.DrawRenderers 重新设置 view port 和 scissor rect - cmd.SetViewport(camera.pixelRect); - cmd.EnableScissorRect(camera.pixelRect); -#endif + context.ExecuteCommandBuffer(cmd); + cmd.Clear(); + if (useDx12) + { + // DX12 下会 context.DrawRenderers 重新设置 view port 和 scissor rect + Rect renderRect = new Rect(0, 0, renderingData.cameraData.cameraTargetDescriptor.width, renderingData.cameraData.cameraTargetDescriptor.height); + cmd.SetViewport(renderRect); + cmd.EnableScissorRect(renderRect); + } } -#if DX12 || UNITY_STANDALONE_OSX - RendererUtils.RendererListDesc rendererListDesc = new (data.m_ShaderTagIdList.ToArray(), renderingData.cullResults,camera); - rendererListDesc.layerMask = camera.cullingMask; - rendererListDesc.sortingCriteria = sortFlags; - rendererListDesc.renderQueueRange = filterSettings.renderQueueRange; - rendererListDesc.layerMask = filterSettings.layerMask; - rendererListDesc.excludeObjectMotionVectors = false; - rendererListDesc.rendererConfiguration = drawSettings.perObjectData; - rendererListDesc.stateBlock = data.m_RenderStateBlock; - cmd.DrawRendererList(context.CreateRendererList(rendererListDesc)); -#else - context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref data.m_RenderStateBlock); -#endif - if (asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) + void DisableVrs() { cmd.BeginSample("DisableVrs"); cmd.IssuePluginEventAndData(RenderingPlugin.GetRenderEventAndDataFunc(), (int)RenderingPlugin.NativeRenderingEvent.DisableVRS, IntPtr.Zero); cmd.EndSample("DisableVrs"); } + if (data.m_IsOpaque) + { + + if (useDx12) + { + RendererUtils.RendererListDesc rendererListDesc = new(data.m_ShaderTagIdList.ToArray(), renderingData.cullResults, camera); + rendererListDesc.sortingCriteria = sortFlags; + rendererListDesc.renderQueueRange = filterSettings.renderQueueRange; + rendererListDesc.layerMask = filterSettings.layerMask; + rendererListDesc.excludeObjectMotionVectors = false; + rendererListDesc.rendererConfiguration = drawSettings.perObjectData; + rendererListDesc.stateBlock = data.m_RenderStateBlock; + cmd.DrawRendererList(context.CreateRendererList(rendererListDesc)); + if (asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) + { + EnableVrs(cmd, useDx12, renderingData, asset); + rendererListDesc.layerMask = 1 << 31; + cmd.DrawRendererList(context.CreateRendererList(rendererListDesc)); + DisableVrs(); + } + + cmd.DisableScissorRect(); + } + else + { + context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref data.m_RenderStateBlock); + + if (asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) + { + EnableVrs(cmd, useDx12, renderingData, asset); + filterSettings.layerMask = 1 << 31; + context.DrawRenderers(renderingData.cullResults, ref drawSettings, ref filterSettings, ref data.m_RenderStateBlock); + DisableVrs(); + } + } + + } + else + { + if (asset.VRSRate != RenderingPlugin.VRSPluginShadingRate.X1_PER_PIXEL) + { + EnableVrs(cmd, useDx12, renderingData, asset); + + RendererUtils.RendererListDesc rendererListDesc = new(data.m_ShaderTagIdList.ToArray(), renderingData.cullResults, camera); + rendererListDesc.sortingCriteria = sortFlags; + rendererListDesc.renderQueueRange = filterSettings.renderQueueRange; + rendererListDesc.layerMask = filterSettings.layerMask; + rendererListDesc.excludeObjectMotionVectors = false; + rendererListDesc.rendererConfiguration = drawSettings.perObjectData; + rendererListDesc.stateBlock = data.m_RenderStateBlock; + cmd.DrawRendererList(context.CreateRendererList(rendererListDesc)); + DisableVrs(); + } + + cmd.DisableScissorRect(); + } + // Render objects that did not match any shader pass with error shader RenderingUtils.RenderObjectsWithError(context, ref renderingData.cullResults, camera, filterSettings, SortingCriteria.None); } diff --git a/ProjectSettings/TagManager.asset b/ProjectSettings/TagManager.asset index 066f826..65a77da 100644 --- a/ProjectSettings/TagManager.asset +++ b/ProjectSettings/TagManager.asset @@ -1,5 +1,5 @@ %YAML 1.1 -%TAG !u! tag:yousandi.cn,2023: +%TAG !u! tag:unity3d.com,2011: --- !u!78 &1 TagManager: serializedVersion: 2 @@ -40,7 +40,7 @@ TagManager: - - - - - + - VRS m_SortingLayers: - name: Default uniqueID: 0