From 0289b1855f5cd94444ce2561621655e5c2a890e6 Mon Sep 17 00:00:00 2001 From: LiRuoChen <571244399@qq.com> Date: Mon, 8 Jun 2026 17:30:34 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=A6=86=E7=9B=96=E8=B0=83?= =?UTF-8?q?=E8=AF=95=E5=8A=9F=E8=83=BD=E6=8F=90=E5=89=8D=E9=80=80=E5=87=BA?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82=20=E4=BF=AE=E5=A4=8D?= =?UTF-8?q?=E5=B1=8F=E5=B9=95=E7=A9=BA=E9=97=B4=E5=9D=90=E6=A0=87=E8=AE=A1?= =?UTF-8?q?=E7=AE=97=E6=97=B6rect=E5=AF=B9=E9=BD=90=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GeoLayerPickerRenderPassFeature.cs | 156 ++++++++++++------ .../ScreenOverrideRect.shader | 4 +- 2 files changed, 107 insertions(+), 53 deletions(-) diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs index a0c83a3..a572a3c 100644 --- a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs +++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs @@ -102,29 +102,32 @@ namespace XericLibrary.PostProcess float normalizedX = centerPixelPos.x / texWidth; float normalizedY = centerPixelPos.y / texHeight; - return new Vector2(normalizedX, normalizedY); + float screenX = feature.sampleRect.x + normalizedX * feature.sampleRect.width; + float screenY = feature.sampleRect.y + normalizedY * feature.sampleRect.height; + + return new Vector2(screenX, screenY); } public Vector2 GetCenterRectLocation(RectTransform rectTransform) { - var normalized = GetCenterRectLocation(); + var screenPos = GetCenterRectLocation(); Vector2 rectSize = rectTransform.rect.size; - float x = rectTransform.rect.x + normalized.x * rectSize.x; - float y = rectTransform.rect.y + normalized.y * rectSize.y; + float x = rectTransform.rect.x + screenPos.x * rectSize.x; + float y = rectTransform.rect.y + screenPos.y * rectSize.y; return new Vector2(x, y); } public Vector2 GetCenterRectAnchoredPosition(RectTransform rectTransform) { - var normalized = GetCenterRectLocation(); + var screenPos = GetCenterRectLocation(); Vector2 pivot = rectTransform.pivot; Vector2 rectSize = rectTransform.rect.size; - float anchoredX = (normalized.x - pivot.x) * rectSize.x; - float anchoredY = (normalized.y - pivot.y) * rectSize.y; + float anchoredX = (screenPos.x - pivot.x) * rectSize.x; + float anchoredY = (screenPos.y - pivot.y) * rectSize.y; return new Vector2(anchoredX, anchoredY); } @@ -517,26 +520,22 @@ namespace XericLibrary.PostProcess private static readonly int DebugRectProp = Shader.PropertyToID("_DebugRect"); private static readonly int DebugMainTex = Shader.PropertyToID("_MainTex"); - class CustomRenderPass : ScriptableRenderPass - { - public Material passMaterial; - public RTHandle passRTHandle; - public RTHandle passReadbackBuffer; - public List passDrawList; - public Rect passSampleRect; - public bool requestReadback; - - // 屏幕调试 - public bool drawDebugOverlay; - public Material debugOverlayMaterial; - public RTHandle cameraColorTarget; // 用于获取屏幕渲染目标 - - private int m_MatIDProperty = Shader.PropertyToID("_MatID"); - - public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + class PickRenderPass : ScriptableRenderPass { - if (passMaterial != null && passRTHandle != null && passDrawList != null && passDrawList.Count > 0) + public Material passMaterial; + public RTHandle passRTHandle; + public RTHandle passReadbackBuffer; + public List passDrawList; + public Rect passSampleRect; + public bool requestReadback; + + private int m_MatIDProperty = Shader.PropertyToID("_MatID"); + + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { + if (passMaterial == null || passRTHandle == null || passDrawList == null || passDrawList.Count == 0) + return; + CommandBuffer cmd = CommandBufferPool.Get("GeoLayerPickBuffer"); cmd.SetRenderTarget(passRTHandle); @@ -591,30 +590,76 @@ namespace XericLibrary.PostProcess GeoLayerPickerRenderPassFeature.Instance.OnReadbackComplete); } } + } - if (drawDebugOverlay && debugOverlayMaterial != null && passRTHandle != null) + class DebugOverlayRenderPass : ScriptableRenderPass + { + public RTHandle sourceRTHandle; + public Material overlayMaterial; + public Rect sampleRect; + + private static readonly int DebugRectProp = Shader.PropertyToID("_DebugRect"); + private static readonly int DebugMainTex = Shader.PropertyToID("_MainTex"); + private static bool s_HasLogged = false; + + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) { - var feature = GeoLayerPickerRenderPassFeature.Instance; - if (feature == null) return; + if (!s_HasLogged && GeoLayerPickerRenderPassFeature.Instance != null && GeoLayerPickerRenderPassFeature.Instance.enableDebugLog) + { + Debug.Log($"[GeoLayerPicker] DebugOverlayRenderPass.Execute called"); + Debug.Log($" overlayMaterial: {(overlayMaterial != null ? "OK" : "null")}"); + Debug.Log($" sourceRTHandle: {(sourceRTHandle != null ? "OK" : "null")}"); + Debug.Log($" sampleRect: {sampleRect}"); + s_HasLogged = true; + } + + if (overlayMaterial == null) + { + if (GeoLayerPickerRenderPassFeature.Instance != null && GeoLayerPickerRenderPassFeature.Instance.enableDebugLog) + { + Debug.LogWarning("[GeoLayerPicker] DebugOverlayRenderPass: overlayMaterial is null"); + } + return; + } + + if (sourceRTHandle == null) + { + if (GeoLayerPickerRenderPassFeature.Instance != null && GeoLayerPickerRenderPassFeature.Instance.enableDebugLog) + { + Debug.LogWarning("[GeoLayerPicker] DebugOverlayRenderPass: sourceRTHandle is null"); + } + return; + } RTHandle currentColorTarget = renderingData.cameraData.renderer.cameraColorTargetHandle; + if (currentColorTarget == null) + { + if (GeoLayerPickerRenderPassFeature.Instance != null && GeoLayerPickerRenderPassFeature.Instance.enableDebugLog) + { + Debug.LogWarning("[GeoLayerPicker] DebugOverlayRenderPass: currentColorTarget is null"); + } + return; + } + CommandBuffer debugCmd = CommandBufferPool.Get("GeoPickerDebugOverlay"); + debugCmd.Clear(); MaterialPropertyBlock debugMpb = new MaterialPropertyBlock(); - debugMpb.SetTexture(DebugMainTex, passRTHandle); + debugMpb.SetTexture(DebugMainTex, sourceRTHandle); debugMpb.SetVector(DebugRectProp, new Vector4( - feature.sampleRect.x, - feature.sampleRect.y, - feature.sampleRect.width, - feature.sampleRect.height + sampleRect.x, + sampleRect.y, + sampleRect.width, + sampleRect.height )); CoreUtils.SetRenderTarget(debugCmd, currentColorTarget); + debugCmd.SetViewport(new Rect(0, 0, renderingData.cameraData.camera.pixelWidth, renderingData.cameraData.camera.pixelHeight)); debugCmd.DrawProcedural( Matrix4x4.identity, - debugOverlayMaterial, + overlayMaterial, 0, MeshTopology.Triangles, 3, @@ -626,20 +671,25 @@ namespace XericLibrary.PostProcess CommandBufferPool.Release(debugCmd); } } - } - private CustomRenderPass m_ScriptablePass; + private PickRenderPass m_PickPass; + private DebugOverlayRenderPass m_DebugOverlayPass; public override void Create() { Instance = this; m_IsDirty = true; - m_ScriptablePass = new CustomRenderPass + m_PickPass = new PickRenderPass { renderPassEvent = RenderPassEvent.AfterRenderingOpaques }; + m_DebugOverlayPass = new DebugOverlayRenderPass + { + renderPassEvent = RenderPassEvent.AfterRenderingTransparents + }; + // 释放旧的 RTHandle if (m_PickRTHandle != null) { @@ -692,8 +742,6 @@ namespace XericLibrary.PostProcess public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) { - if (m_ScriptablePass == null || pickMaterial == null) return; - if (m_IsDirty) { RebuildDrawList(); @@ -721,20 +769,24 @@ namespace XericLibrary.PostProcess shouldRead = true; } - // 后处理参数 - m_ScriptablePass.passMaterial = pickMaterial; - m_ScriptablePass.passRTHandle = m_PickRTHandle; - m_ScriptablePass.passReadbackBuffer = m_ReadbackBufferHandle; - m_ScriptablePass.passDrawList = m_DrawList; - m_ScriptablePass.passSampleRect = sampleRect; - m_ScriptablePass.requestReadback = shouldRead; + if (m_PickPass != null && pickMaterial != null) + { + m_PickPass.passMaterial = pickMaterial; + m_PickPass.passRTHandle = m_PickRTHandle; + m_PickPass.passReadbackBuffer = m_ReadbackBufferHandle; + m_PickPass.passDrawList = m_DrawList; + m_PickPass.passSampleRect = sampleRect; + m_PickPass.requestReadback = shouldRead; + renderer.EnqueuePass(m_PickPass); + } - // 配置调试覆盖图参数 - m_ScriptablePass.drawDebugOverlay = enableDebugLog; // 由 Inspector 开关控制 - m_ScriptablePass.debugOverlayMaterial = m_DebugOverlayMaterial; - // m_ScriptablePass.cameraColorTarget = renderer.cameraColorTargetHandle; // 当前是注册阶段无法获取目标 - - renderer.EnqueuePass(m_ScriptablePass); + if (m_DebugOverlayPass != null && enableDebugLog && m_DebugOverlayMaterial != null) + { + m_DebugOverlayPass.sourceRTHandle = m_PickRTHandle; + m_DebugOverlayPass.overlayMaterial = m_DebugOverlayMaterial; + m_DebugOverlayPass.sampleRect = sampleRect; + renderer.EnqueuePass(m_DebugOverlayPass); + } } private void OnReadbackComplete(AsyncGPUReadbackRequest request) diff --git a/Runtime/MeshDetection_URP/ScreenOverrideRect.shader b/Runtime/MeshDetection_URP/ScreenOverrideRect.shader index fb7953d..71899d2 100644 --- a/Runtime/MeshDetection_URP/ScreenOverrideRect.shader +++ b/Runtime/MeshDetection_URP/ScreenOverrideRect.shader @@ -75,7 +75,9 @@ Shader "Hidden/XericLibrary/GeoLayerPicker/ScreenOverrideRect" } // 将世界坐标映射为可见颜色 - float3 debugColor = frac(col.rgb * 0.1) ^ col.a; + float3 debugColor = frac(col.rgb * 0.1); + float matIDColor = frac(col.a * 0.05); + debugColor.r = lerp(debugColor.r, matIDColor, 0.5); return float4(debugColor, 0.9); } ENDHLSL