Skip to content

Commit 0da5350

Browse files
committed
fix: UI culling
1 parent a96faa9 commit 0da5350

File tree

5 files changed

+63
-8
lines changed

5 files changed

+63
-8
lines changed

Assets/UnityBox.unity

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17451,7 +17451,7 @@ GameObject:
1745117451
m_Icon: {fileID: 0}
1745217452
m_NavMeshLayer: 0
1745317453
m_StaticEditorFlags: 0
17454-
m_IsActive: 1
17454+
m_IsActive: 0
1745517455
--- !u!114 &1679610428
1745617456
MonoBehaviour:
1745717457
m_ObjectHideFlags: 0
@@ -26745,6 +26745,12 @@ MonoBehaviour:
2674526745
name: dance_loop
2674626746
- hash: 877246816
2674726747
name: Afk Init
26748+
- hash: -268247177
26749+
name: Empty
26750+
- hash: 320039515
26751+
name: Local
26752+
- hash: 589858999
26753+
name: NonLocal
2674826754
autoFootsteps: 1
2674926755
autoLocomotion: 1
2675026756
collider_head:
@@ -39899,13 +39905,14 @@ GameObject:
3989939905
- component: {fileID: 1124634812806735779}
3990039906
- component: {fileID: 1097081895637002651}
3990139907
- component: {fileID: 6481149578489306159}
39908+
- component: {fileID: 6481149578489306160}
3990239909
m_Layer: 0
3990339910
m_Name: TEST ASS ND
3990439911
m_TagString: Untagged
3990539912
m_Icon: {fileID: 0}
3990639913
m_NavMeshLayer: 0
3990739914
m_StaticEditorFlags: 0
39908-
m_IsActive: 0
39915+
m_IsActive: 1
3990939916
--- !u!114 &6481149578489306159
3991039917
MonoBehaviour:
3991139918
m_ObjectHideFlags: 0
@@ -39933,6 +39940,34 @@ MonoBehaviour:
3993339940
hideUI: 0
3993439941
enableOverflow: 1
3993539942
writeDefaultsMode: 0
39943+
--- !u!114 &6481149578489306160
39944+
MonoBehaviour:
39945+
m_ObjectHideFlags: 0
39946+
m_CorrespondingSourceObject: {fileID: 0}
39947+
m_PrefabInstance: {fileID: 0}
39948+
m_PrefabAsset: {fileID: 0}
39949+
m_GameObject: {fileID: 6481149578489306158}
39950+
m_Enabled: 1
39951+
m_EditorHideFlags: 0
39952+
m_Script: {fileID: 11500000, guid: d9e94e501a2d4c95bff3d5601013d923, type: 3}
39953+
m_Name:
39954+
m_EditorClassIdentifier:
39955+
version: 3
39956+
unityVersion: 2022.3.22f1
39957+
vrcfuryVersion: 1.1279.0
39958+
somethingIsBroken: 0
39959+
config:
39960+
features: []
39961+
content:
39962+
rid: 5603525201153228800
39963+
references:
39964+
version: 2
39965+
RefIds:
39966+
- rid: 5603525201153228800
39967+
type: {class: FixWriteDefaults, ns: VF.Model.Feature, asm: VRCFury}
39968+
data:
39969+
version: 0
39970+
mode: 0
3993639971
--- !u!4 &6481295841211110324
3993739972
Transform:
3993839973
m_ObjectHideFlags: 0

Assets/UnityBox/AvatarSecuritySystem/Editor/ASS_TechnicalDoc.md

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -414,14 +414,15 @@ Remote ──(PasswordCorrect)────────────────
414414
#### 4.4.1 全屏覆盖 UI (`ASS_UI`)
415415

416416
- **渲染方式**: 使用自定义 Shader (`UnityBox/ASS_UI`) 直接渲染到摄像机全屏
417-
- Shader 在顶点着色器中将 Quad 顶点直接映射到裁剪空间覆盖整个屏幕
417+
- Shader 在顶点着色器中将 Quad 顶点通过视图空间投影映射到裁剪空间覆盖整个屏幕
418+
- 通过在相机前方 `d=5` 单位处构建视图空间坐标再投影,确保在近/远裁剪面内且渲染在 VRChat 表情镜摄像机后方
418419
- **不需要** 世界空间定位
419420
- **位置**: 作为 Avatar 根对象的直接子对象
420421
- **默认状态**: `SetActive(false)`,仅 Locked 状态时由动画启用
421422
- **Mesh**: 简单 Quad(4 顶点),顶点位置无关紧要(由 Shader 重新映射)
422423
- 三角形绕序:`{0, 1, 2, 0, 2, 3}`(统一逆时针,Unity 标准正面定义)
423424
- 调用 `RecalculateNormals()``RecalculateTangents()` 确保法线/切线正确
424-
- **Bounds 设置为 100000 单位**`mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 100000f)`),防止 Unity 视锥体剔除导致 UI 在特定视角不可见
425+
- **Bounds 设置为 200 单位**`mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 200f)`),防止 Unity 视锥体剔除导致 UI 在特定视角不可见
425426
- **材质属性**(已混淆,属性名不可读):
426427
- 背景颜色: 白色(遮挡背景)
427428
- 进度条颜色: 红色
@@ -867,3 +868,19 @@ VRCFury 会在 blend tree 中以 Float 方式使用 `IsLocal` 参数(如 SPS/H
867868

868869
- Defense.cs 不包含任何注释(代码足够自文档化,注释在技术文档中维护)
869870
- 粒子光源复用策略:不创建额外 Light 组件,复用 LightDefense 已有的 Light 引用,避免超出 LIGHT_MAX_COUNT 上限
871+
872+
### 10.7 UI Shader 全屏覆盖深度修复(v0.3.3)
873+
874+
**问题(v0.3.2)**
875+
876+
UI Shader 在顶点着色器中于相机前方 `d=100` 单位处构建视图空间坐标再投影到裁剪空间。当某些 VRChat 地图的相机远裁剪面 < 100 时,几何体超出裁剪空间有效深度范围,被 GPU 硬件裁剪(发生在光栅化之前,`ZTest Always` 无法阻止)。但 VRChat 表情镜使用独立相机且远裁剪面通常更大,因此 UI 在镜中能正常显示而主视角不显示。
877+
878+
同时 `Feedback.cs` 中 Mesh Bounds 仅 2 单位,在某些世界中可能被 Unity CPU 端视锥体剔除。
879+
880+
**修复方案(v0.3.3)**
881+
882+
1. **UI Shader**: 将 `d``100` 改为 `5`
883+
- 大于相机近裁剪面(~0.01-0.3),确保不被近裁剪面剔除
884+
- 小于所有地图的远裁剪面,确保不被远裁剪面剔除
885+
- 大于 VRChat 表情镜摄像机距离(~3-4m),确保 UI 渲染在表情镜后方(遮挡表情镜)
886+
2. **Feedback.cs**: Mesh Bounds 从 `2f` 增大到 `200f`,防止 CPU 端视锥体剔除

Assets/UnityBox/AvatarSecuritySystem/Editor/Feedback.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,8 +105,7 @@ private GameObject CreateUIMesh()
105105
mesh.RecalculateNormals();
106106
mesh.RecalculateTangents();
107107
// 设置较大 Bounds 防止 Unity 视锥体剔除(Shader 负责全屏映射)
108-
// 注意:不能太大否则会触发 VRChat 性能评估 Bounds VeryPoor
109-
mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 2f);
108+
mesh.bounds = new Bounds(Vector3.zero, Vector3.one * 200f);
110109

111110
var meshFilter = meshObj.AddComponent<MeshFilter>();
112111
meshFilter.sharedMesh = mesh;

Assets/UnityBox/AvatarSecuritySystem/Shaders/UI.shader

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,11 @@ Shader "UnityBox/ASS_UI"
8282
ndc.y = -ndc.y;
8383
#endif
8484

85-
float d = 100.0;
85+
// d=5: 在相机前方 5 单位处构建全屏 quad
86+
// 必须大于相机近裁剪面(~0.01-0.3)且小于远裁剪面
87+
// 原先 d=100 会超出某些地图相机的远裁剪面导致 GPU 硬裁剪
88+
// 同时需要大于 VRChat 表情镜的摄像机距离(~3-4m)以渲染在镜后
89+
float d = 5;
8690
float3 vp = float3(
8791
(ndc.x + UNITY_MATRIX_P[0][2]) * d / UNITY_MATRIX_P[0][0],
8892
(ndc.y + UNITY_MATRIX_P[1][2]) * d / UNITY_MATRIX_P[1][1],

Assets/UnityBox/AvatarSecuritySystem/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "top.sealoong.unitybox.avatar-security-system",
33
"displayName": "Avatar Security System",
4-
"version": "0.3.2",
4+
"version": "0.3.3",
55
"description": "A VRChat avatar editor tool for protecting avatars with gesture-based password security system.",
66
"unity": "2022.3",
77
"author": {

0 commit comments

Comments
 (0)