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: