From 263bb68686394654cdfba1d1520ba3ad1bef86eb Mon Sep 17 00:00:00 2001 From: LiRuoChen <571244399@qq.com> Date: Fri, 5 Jun 2026 14:35:42 +0800 Subject: [PATCH] =?UTF-8?q?=E5=88=9D=E5=A7=8B=E5=8C=96=E5=90=8E=E5=A4=84?= =?UTF-8?q?=E7=90=86=E9=98=B6=E6=AE=B5=E5=B1=8F=E5=B9=95=E5=A4=84=E7=90=86?= =?UTF-8?q?=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CHANGELOG.md | 7 + CHANGELOG.md.meta | 7 + Documentation.meta | 8 + Editor.meta | 8 + ...endetectiongrolayerpickerUrp.Editor.asmdef | 22 +++ ...ectiongrolayerpickerUrp.Editor.asmdef.meta | 7 + README.md | 2 + README.md.meta | 7 + Runtime.meta | 8 + ...s3.ScreendetectiongrolayerpickerUrp.asmdef | 17 +++ ...reendetectiongrolayerpickerUrp.asmdef.meta | 7 + Runtime/MeshDetection_Builtin.meta | 8 + .../MeshDetection_Builtin/GeoLayerPicker.cs | 119 +++++++++++++++ .../GeoLayerPicker.cs.meta | 3 + .../ScreenMeshPicking.shader | 62 ++++++++ .../ScreenMeshPicking.shader.meta | 9 ++ .../MeshDetection_Builtin/XMeshPicking.mat | 30 ++++ .../XMeshPicking.mat.meta | 8 + Runtime/MeshDetection_URP.meta | 8 + .../GeoLayerPickerRenderPassFeature.cs | 143 ++++++++++++++++++ .../GeoLayerPickerRenderPassFeature.cs.meta | 11 ++ package.json | 7 + package.json.meta | 7 + 23 files changed, 515 insertions(+) create mode 100644 CHANGELOG.md create mode 100644 CHANGELOG.md.meta create mode 100644 Documentation.meta create mode 100644 Editor.meta create mode 100644 Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef create mode 100644 Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta create mode 100644 README.md create mode 100644 README.md.meta create mode 100644 Runtime.meta create mode 100644 Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef create mode 100644 Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta create mode 100644 Runtime/MeshDetection_Builtin.meta create mode 100644 Runtime/MeshDetection_Builtin/GeoLayerPicker.cs create mode 100644 Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta create mode 100644 Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader create mode 100644 Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta create mode 100644 Runtime/MeshDetection_Builtin/XMeshPicking.mat create mode 100644 Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta create mode 100644 Runtime/MeshDetection_URP.meta create mode 100644 Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs create mode 100644 Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta create mode 100644 package.json create mode 100644 package.json.meta diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..b78670b --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,7 @@ +# Changelog + +## [Unreleased] + +* built-in 阶段的简易处理器 +* URP 阶段的处理器 + diff --git a/CHANGELOG.md.meta b/CHANGELOG.md.meta new file mode 100644 index 0000000..189ec46 --- /dev/null +++ b/CHANGELOG.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 8c252a65d20865247a6d3cc2ba1f0075 +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Documentation.meta b/Documentation.meta new file mode 100644 index 0000000..542131f --- /dev/null +++ b/Documentation.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 7d673101928967242bf6cdfa9cb0ccc2 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor.meta b/Editor.meta new file mode 100644 index 0000000..a535c67 --- /dev/null +++ b/Editor.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 6760f91188a394147b91452bfe315216 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef new file mode 100644 index 0000000..e22d85c --- /dev/null +++ b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef @@ -0,0 +1,22 @@ +{ + "name": "Lrss3.ScreendetectiongrolayerpickerUrp.Editor", + "rootNamespace": "", + "references": [ + "Lrss3.ScreendetectiongrolayerpickerUrp", + "Unity.RenderPipelines.Universal.Runtime", + "Unity.RenderPipelines.Universal.Editor", + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.Core.Editor" + ], + "includePlatforms": [ + "Editor" + ], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta new file mode 100644 index 0000000..fccf10a --- /dev/null +++ b/Editor/Lrss3.ScreendetectiongrolayerpickerUrp.Editor.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: 655ba29a1fbde0447bf386c055e931eb +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/README.md b/README.md new file mode 100644 index 0000000..23dd411 --- /dev/null +++ b/README.md @@ -0,0 +1,2 @@ +# Unity 灞忓箷绌洪棿鍚庡鐞嗛樁娈垫鏌ュ櫒-妯″瀷鏁版嵁鎻愬彇鍣� + diff --git a/README.md.meta b/README.md.meta new file mode 100644 index 0000000..6d97bfa --- /dev/null +++ b/README.md.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: abe80e4311f5be343adfcf420b846c0a +TextScriptImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime.meta b/Runtime.meta new file mode 100644 index 0000000..c7292da --- /dev/null +++ b/Runtime.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: a825232565e66c0469f297525ad1e8cb +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef new file mode 100644 index 0000000..a2ab97a --- /dev/null +++ b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef @@ -0,0 +1,17 @@ +{ + "name": "Lrss3.ScreendetectiongrolayerpickerUrp", + "rootNamespace": "", + "references": [ + "Unity.RenderPipelines.Core.Runtime", + "Unity.RenderPipelines.Universal.Runtime" + ], + "includePlatforms": [], + "excludePlatforms": [], + "allowUnsafeCode": false, + "overrideReferences": false, + "precompiledReferences": [], + "autoReferenced": true, + "defineConstraints": [], + "versionDefines": [], + "noEngineReferences": false +} \ No newline at end of file diff --git a/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta new file mode 100644 index 0000000..b35c441 --- /dev/null +++ b/Runtime/Lrss3.ScreendetectiongrolayerpickerUrp.asmdef.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: bbdbb3efc0f815a488c85c3dcb7a6151 +AssemblyDefinitionImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin.meta b/Runtime/MeshDetection_Builtin.meta new file mode 100644 index 0000000..8ccbd86 --- /dev/null +++ b/Runtime/MeshDetection_Builtin.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: e1ea6370245890746869db987244b160 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs new file mode 100644 index 0000000..50e72f9 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs @@ -0,0 +1,119 @@ +锘縰sing System; +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using XericLibrary.Runtime.Type; + +namespace Deconstruction.ScreenDetection.MeshDetection +{ + /// + /// 鍦ㄥ睆骞曚笂鎴彇妯″瀷鐨勮〃闈㈠睘鎬� + /// + /// + public class GeoLayerPicker : MonoBehaviour + { + public Camera targetCamera; + public Material pickMaterial; + public MeshFilter[] geoMeshes; // 澶栭儴鍙渶鎷栧叆鍦拌川灞傜綉鏍� + + public Vector2Int pickRTSize = new Vector2Int(64, 64); + public Bool2 pickRTAdapt = new Bool2(false, true); + + private RenderTexture pickRT; + private Texture2D readTex; + private CommandBuffer cmd; + private float nextCheckTime; + + private static readonly int MatID = Shader.PropertyToID("_MatID"); + + // 銆愭牳蹇冦�戠紦瀛樺睍骞冲悗鐨勭粯鍒舵暟鎹� + private struct SubMeshDrawData + { + public Mesh mesh; + public Matrix4x4 matrix; + public int subMeshIndex; + public int uniqueMatID; // 鍒嗛厤缁欒繖涓彃妲界殑鍞竴ID + } + + private List drawList = new List(); + + void Start() + { + // 1. 灞曞钩鎵�鏈夌綉鏍肩殑 SubMesh + if (geoMeshes != null) + { + int globalIDCounter = 1; // ID浠�1寮�濮嬶紝0鐣欑粰鑳屾櫙 + foreach (var mf in geoMeshes) + { + if (mf == null || mf.sharedMesh == null) continue; + + Mesh mesh = mf.sharedMesh; + Matrix4x4 matrix = mf.transform.localToWorldMatrix; + + // 閬嶅巻杩欎釜缃戞牸涓婄殑姣忎竴涓潗璐ㄦ彃妲� + for (int sub = 0; sub < mesh.subMeshCount; sub++) + { + drawList.Add(new SubMeshDrawData + { + mesh = mesh, + matrix = matrix, + subMeshIndex = sub, + uniqueMatID = globalIDCounter++ + }); + } + } + } + + // 2. 鍒濆鍖� RT 鍜� CommandBuffer + pickRT = new RenderTexture(pickRTSize.x, pickRTSize.y, 0, RenderTextureFormat.ARGB32); + pickRT.Create(); + readTex = new Texture2D(pickRTSize.x, pickRTSize.y, TextureFormat.RGBA32, false); + + cmd = new CommandBuffer(); + cmd.name = "GeoLayerPickBuffer"; + targetCamera.AddCommandBuffer(CameraEvent.BeforeForwardOpaque, cmd); + } + + void Update() + { + // if (Time.time < nextCheckTime) return; + // nextCheckTime = Time.time + 0.2f; + + cmd.Clear(); + + // 瑙嗗彛璁剧疆 + var screenSize = new Vector2(Screen.width, Screen.height); + var screenStart = (screenSize - pickRTSize) / 2; + Rect pickRect = new Rect(pickRTAdapt.X * screenStart.x, pickRTAdapt.Y * screenStart.y, pickRTAdapt.x ? Screen.width : pickRTSize.x, + pickRTAdapt.x ? Screen.height : pickRTSize.y); + cmd.SetViewport(pickRect); + cmd.SetRenderTarget(pickRT); + cmd.ClearRenderTarget(true, true, Color.clear); + + // 銆愭牳蹇冦�戦亶鍘嗗睍骞冲悗鐨� SubMesh 鍒楄〃杩涜缁樺埗 + for (int i = 0; i < drawList.Count; i++) + { + var data = drawList[i]; + pickMaterial.SetInt(MatID, data.uniqueMatID); + + // 浣跨敤甯� submeshIndex 鍙傛暟鐨� DrawMesh 閲嶈浇 + cmd.DrawMesh(data.mesh, data.matrix, pickMaterial, data.subMeshIndex); + } + + // 璇诲彇鍍忕礌 + RenderTexture.active = pickRT; + readTex.ReadPixels(new Rect(0, 0, pickRTSize.x, pickRTSize.y), 0, 0); + readTex.Apply(); + RenderTexture.active = null; + + ProcessPickedData(); + } + + void ProcessPickedData() + { + Color32[] pixels = readTex.GetPixels32(); + // 瑙g爜 pixels 涓殑 uniqueMatID 鍜� WorldPos + // 鏍规嵁 uniqueMatID 鍙嶆煡鍦拌川灞備俊鎭苟鏇存柊 UI... + } + } +} \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta new file mode 100644 index 0000000..7bc6af7 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/GeoLayerPicker.cs.meta @@ -0,0 +1,3 @@ +fileFormatVersion: 2 +guid: 04e13623766d409e9c979b15693bb2dd +timeCreated: 1780626411 \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader new file mode 100644 index 0000000..86abbcc --- /dev/null +++ b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader @@ -0,0 +1,62 @@ +Shader "XericLibrary/ScreenDectection/MeshPicking" +{ + Properties + { + // 传入材质ID + _MatID ("Material ID", Int) = 0 + } + SubShader + { + Tags { "RenderType"="Opaque" } + LOD 100 + + Pass + { + // 关闭光照和雾效,纯数据输出 + Lighting Off + Fog { Mode Off } + + CGPROGRAM + #pragma vertex vert + #pragma fragment frag + #include "UnityCG.cginc" + + struct appdata + { + float4 vertex : POSITION; + }; + + struct v2f + { + float4 vertex : SV_POSITION; + float3 worldPos : TEXCOORD0; // 传递世界坐标给片段着色器 + }; + + int _MatID; // 接收材质ID + + v2f vert (appdata v) + { + v2f o; + o.vertex = UnityObjectToClipPos(v.vertex); + // 计算世界坐标并传递 + o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; + return o; + } + + fixed4 frag (v2f i) : SV_Target + { + // 1. 将世界坐标编码到 RGB 通道 + // 假设你的地质模型世界坐标范围在 -1000 到 1000 之间 + // 加上 1000 变成 0~2000,再除以 2000 变成 0~1 + float3 encodedPos = (i.worldPos + 1000.0) / 2000.0; + + // 2. 将材质ID编码到 Alpha 通道 (假设ID不超过255) + float encodedID = _MatID / 255.0; + + // 输出 RGBA = (PosX, PosY, PosZ, MatID) + return fixed4(encodedPos.x, encodedPos.y, encodedPos.z, encodedID); + } + ENDCG + } + } +} \ No newline at end of file diff --git a/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta new file mode 100644 index 0000000..3b20cd5 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/ScreenMeshPicking.shader.meta @@ -0,0 +1,9 @@ +fileFormatVersion: 2 +guid: 624bb1fb3e89c5342ba64aec70bfd6af +ShaderImporter: + externalObjects: {} + defaultTextures: [] + nonModifiableTextures: [] + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_Builtin/XMeshPicking.mat b/Runtime/MeshDetection_Builtin/XMeshPicking.mat new file mode 100644 index 0000000..dc5eb48 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/XMeshPicking.mat @@ -0,0 +1,30 @@ +%YAML 1.1 +%TAG !u! tag:unity3d.com,2011: +--- !u!21 &2100000 +Material: + serializedVersion: 8 + m_ObjectHideFlags: 0 + m_CorrespondingSourceObject: {fileID: 0} + m_PrefabInstance: {fileID: 0} + m_PrefabAsset: {fileID: 0} + m_Name: XMeshPicking + m_Shader: {fileID: 4800000, guid: 624bb1fb3e89c5342ba64aec70bfd6af, type: 3} + m_Parent: {fileID: 0} + m_ModifiedSerializedProperties: 0 + m_ValidKeywords: [] + m_InvalidKeywords: [] + m_LightmapFlags: 4 + m_EnableInstancingVariants: 0 + m_DoubleSidedGI: 0 + m_CustomRenderQueue: -1 + stringTagMap: {} + disabledShaderPasses: [] + m_LockedProperties: + m_SavedProperties: + serializedVersion: 3 + m_TexEnvs: [] + m_Ints: [] + m_Floats: + - _MatID: 73 + m_Colors: [] + m_BuildTextureStacks: [] diff --git a/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta b/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta new file mode 100644 index 0000000..bef56e2 --- /dev/null +++ b/Runtime/MeshDetection_Builtin/XMeshPicking.mat.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: ed648077cd0dc06418a72fd06e15af7b +NativeFormatImporter: + externalObjects: {} + mainObjectFileID: 2100000 + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_URP.meta b/Runtime/MeshDetection_URP.meta new file mode 100644 index 0000000..dc2b6c2 --- /dev/null +++ b/Runtime/MeshDetection_URP.meta @@ -0,0 +1,8 @@ +fileFormatVersion: 2 +guid: 9ca912e2c263eab47b131fc429db0a39 +folderAsset: yes +DefaultImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs new file mode 100644 index 0000000..f1d8638 --- /dev/null +++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs @@ -0,0 +1,143 @@ +using System.Collections.Generic; +using UnityEngine; +using UnityEngine.Rendering; +using UnityEngine.Rendering.Universal; + +#if UNITY_2022_1_OR_NEWER // urp 13 +namespace XericLibrary.PostProcess +{ + // 定义数据结构,用来存储展平后的 SubMesh 信息 + [System.Serializable] + public struct SubMeshDrawData + { + public Mesh mesh; + public Matrix4x4 matrix; + public int subMeshIndex; + public int uniqueMatID; + } + + public class GeoLayerPickerRenderPassFeature : ScriptableRendererFeature + { + + // 在 Feature 外部类中,添加 Inspector 面板需要的配置参数 + [Header("拾取设置")] + public Material pickMaterial; + public MeshFilter[] geoMeshes; + public Vector2Int pickRTSize = new Vector2Int(64, 64); + + // 内部持有的资源 + private RenderTexture m_PickRT; + private List m_DrawList = new List(); + + class GeoLayerPickerRenderPass : ScriptableRenderPass + { + public Material passMaterial; + public RenderTexture passRT; + public List passDrawList; + + private int m_MatIDProperty = Shader.PropertyToID("_MatID"); + + public override void OnCameraSetup(CommandBuffer cmd, ref RenderingData renderingData) + { + // 在 URP 中,必须在这里告诉管线我们要渲染到哪张 RT 上 + if (passRT != null) + { + ConfigureTarget(new RenderTargetIdentifier(passRT)); + ConfigureClear(ClearFlag.All, Color.clear); + } + } + + public override void Execute(ScriptableRenderContext context, ref RenderingData renderingData) + { + // 安全检查 + if (passMaterial == null || passRT == null || passDrawList == null || passDrawList.Count == 0) + return; + + // 从对象池获取 CommandBuffer (性能更好) + CommandBuffer cmd = CommandBufferPool.Get("GeoLayerPickBuffer"); + + // 在 URP 13 中,绝对不能在 Execute 里用 cmd.SetRenderTarget()。必须重写 OnCameraSetup,使用 ConfigureTarget() 告诉 URP 这个 Pass 的输出目标是你创建的 m_PickRT。 + // 设置视口为 RT 的尺寸 (64x64) + cmd.SetViewport(new Rect(0, 0, passRT.width, passRT.height)); + + // 【核心】遍历绘制每一个 SubMesh + for (int i = 0; i < passDrawList.Count; i++) + { + var data = passDrawList[i]; + cmd.SetGlobalInt(m_MatIDProperty, data.uniqueMatID); + // 注意第四个参数 submeshIndex,这是多材质插槽的关键 + cmd.DrawMesh(data.mesh, data.matrix, passMaterial, data.subMeshIndex); + } + + // 提交命令给 GPU 执行 + context.ExecuteCommandBuffer(cmd); + CommandBufferPool.Release(cmd); + } + + public override void OnCameraCleanup(CommandBuffer cmd) + { + } + } + + GeoLayerPickerRenderPass m_ScriptablePass; + + public override void Create() + { + m_ScriptablePass = new GeoLayerPickerRenderPass(); + + m_ScriptablePass.renderPassEvent = RenderPassEvent.AfterRenderingOpaques; + + // 【步骤 4】在 Create 中初始化 RT,并展平 SubMesh 数据 + if (m_PickRT != null) m_PickRT.Release(); + m_PickRT = new RenderTexture(pickRTSize.x, pickRTSize.y, 0, RenderTextureFormat.ARGB32); + m_PickRT.Create(); + + RebuildDrawList(); + } + + + // 提供一个公开方法,方便运行时动态刷新网格列表 + public void RebuildDrawList() + { + m_DrawList.Clear(); + if (geoMeshes == null) + return; + + int globalIDCounter = 1; // ID 从 1 开始,0 留给背景 + foreach (var mf in geoMeshes) + { + if (mf == null || mf.sharedMesh == null) continue; + + // 遍历网格的每一个材质插槽 (SubMesh) + for (int sub = 0; sub < mf.sharedMesh.subMeshCount; sub++) + { + m_DrawList.Add(new SubMeshDrawData + { + mesh = mf.sharedMesh, + matrix = mf.transform.localToWorldMatrix, + subMeshIndex = sub, + uniqueMatID = globalIDCounter++ + }); + } + } + } + + public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData) + { + // 将外部数据传递给内部的 Pass,并注入管线 + if (m_ScriptablePass != null) + { + m_ScriptablePass.passMaterial = pickMaterial; + m_ScriptablePass.passRT = m_PickRT; + m_ScriptablePass.passDrawList = m_DrawList; + + renderer.EnqueuePass(m_ScriptablePass); + } + } + + + // 暴露 RT 给外部读取像素用 + public RenderTexture GetPickRT() => m_PickRT; + } +} +#endif \ No newline at end of file diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta new file mode 100644 index 0000000..d31e1a9 --- /dev/null +++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs.meta @@ -0,0 +1,11 @@ +fileFormatVersion: 2 +guid: 743401b70b599714a91857602199159a +MonoImporter: + externalObjects: {} + serializedVersion: 2 + defaultReferences: [] + executionOrder: 0 + icon: {instanceID: 0} + userData: + assetBundleName: + assetBundleVariant: diff --git a/package.json b/package.json new file mode 100644 index 0000000..798fb3a --- /dev/null +++ b/package.json @@ -0,0 +1,7 @@ +{ + "name": "com.lrss3.screendetectiongrolayerpicker-urp", + "displayName": "ScreenDetectionGroLayerPicker-URP", + "version": "0.1.0", + "unity": "2022.1", + "description": "\u6293\u53d6\u5c4f\u5e55\u4e2d\u770b\u5230\u7684\u6a21\u578b\u4fe1\u606f" +} \ No newline at end of file diff --git a/package.json.meta b/package.json.meta new file mode 100644 index 0000000..446dc5f --- /dev/null +++ b/package.json.meta @@ -0,0 +1,7 @@ +fileFormatVersion: 2 +guid: b4f64761718f61141ba89ea791fe26e0 +PackageManifestImporter: + externalObjects: {} + userData: + assetBundleName: + assetBundleVariant: