diff --git a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs
index e05f6f5..23f0d25 100644
--- a/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs
+++ b/Runtime/MeshDetection_URP/GeoLayerPickerRenderPassFeature.cs
@@ -11,6 +11,16 @@ using XericLibrary.Runtime.MacroLibrary;
#if UNITY_2022_1_OR_NEWER
namespace XericLibrary.PostProcess
{
+ ///
+ /// 摄像机匹配模式
+ ///
+ public enum CameraMatchMode
+ {
+ /// 通过 MainCamera 标签匹配
+ Tag,
+ /// 通过名称匹配 "Main Camera"
+ Name
+ }
///
/// 用于存储展平后的 SubMesh 渲染数据
///
@@ -326,6 +336,8 @@ namespace XericLibrary.PostProcess
public IReadOnlyList GetMaterialIslands()
{
+ if (!isActive)
+ return Array.Empty();
UpdateMaterialIslands();
return m_MaterialIslands;
}
@@ -599,6 +611,13 @@ namespace XericLibrary.PostProcess
#region Inspector 配置参数
+ [Header("摄像机过滤")]
+ [Tooltip("开启后只在 MainCamera 上执行,避免多摄像机 FOV 不一致导致结果错位。")]
+ public bool onlyOnMainCamera = true;
+
+ [Tooltip("MainCamera 匹配模式:Tag = 通过 MainCamera 标签匹配;Name = 通过名称匹配")]
+ public CameraMatchMode cameraMatchMode = CameraMatchMode.Tag;
+
[Header("拾取材质与尺寸")] public Material pickMaterial;
public Vector2Int pickRTSize = new Vector2Int(64, 64);
@@ -860,6 +879,12 @@ namespace XericLibrary.PostProcess
public override void AddRenderPasses(ScriptableRenderer renderer, ref RenderingData renderingData)
{
+ Camera currentCam = renderingData.cameraData.camera;
+
+ // 如果开启 onlyOnMainCamera,只匹配目标摄像机
+ if (onlyOnMainCamera && !IsMainCamera(currentCam))
+ return;
+
if (m_IsDirty)
{
RebuildDrawList();
@@ -907,6 +932,22 @@ namespace XericLibrary.PostProcess
}
}
+ /// 判断当前摄像机是否为目标摄像机
+ private bool IsMainCamera(Camera cam)
+ {
+ if (cam == null) return false;
+
+ switch (cameraMatchMode)
+ {
+ case CameraMatchMode.Tag:
+ return cam.CompareTag("MainCamera");
+ case CameraMatchMode.Name:
+ return cam.name == "Main Camera";
+ default:
+ return false;
+ }
+ }
+
private void OnReadbackComplete(AsyncGPUReadbackRequest request)
{
m_IsReadbackInProgress = false;