cesium-to-three 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +226 -0
- package/dist/arrow.js +523 -0
- package/dist/arrow.js.map +1 -0
- package/dist/ground.js +34 -0
- package/dist/ground.js.map +1 -0
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -0
- package/dist/text-primitive-Ci0sbuh1.js +60066 -0
- package/dist/text-primitive-Ci0sbuh1.js.map +1 -0
- package/dist/types/cesium-three-ground.d.ts +2 -0
- package/dist/types/cesium-three-ground.d.ts.map +1 -0
- package/dist/types/lib/arrow/arrow-curves.d.ts +73 -0
- package/dist/types/lib/arrow/arrow-curves.d.ts.map +1 -0
- package/dist/types/lib/arrow/arrow-geometry.d.ts +140 -0
- package/dist/types/lib/arrow/arrow-geometry.d.ts.map +1 -0
- package/dist/types/lib/arrow/arrow-polygon.d.ts +87 -0
- package/dist/types/lib/arrow/arrow-polygon.d.ts.map +1 -0
- package/dist/types/lib/arrow/arrow-types.d.ts +152 -0
- package/dist/types/lib/arrow/arrow-types.d.ts.map +1 -0
- package/dist/types/lib/arrow/index.d.ts +8 -0
- package/dist/types/lib/arrow/index.d.ts.map +1 -0
- package/dist/types/lib/arrow/shapes/assault-direction-arrow.d.ts +20 -0
- package/dist/types/lib/arrow/shapes/assault-direction-arrow.d.ts.map +1 -0
- package/dist/types/lib/arrow/shapes/attack-arrow.d.ts +56 -0
- package/dist/types/lib/arrow/shapes/attack-arrow.d.ts.map +1 -0
- package/dist/types/lib/arrow/shapes/curved-arrow.d.ts +10 -0
- package/dist/types/lib/arrow/shapes/curved-arrow.d.ts.map +1 -0
- package/dist/types/lib/arrow/shapes/fine-arrow.d.ts +23 -0
- package/dist/types/lib/arrow/shapes/fine-arrow.d.ts.map +1 -0
- package/dist/types/lib/arrow/shapes/swallowtail-attack-arrow.d.ts +12 -0
- package/dist/types/lib/arrow/shapes/swallowtail-attack-arrow.d.ts.map +1 -0
- package/dist/types/lib/ground/cesium-ground-adapter.d.ts +9 -0
- package/dist/types/lib/ground/cesium-ground-adapter.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-construct-extruded.d.ts +62 -0
- package/dist/types/lib/ground/circle/circle-construct-extruded.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-extents.d.ts +23 -0
- package/dist/types/lib/ground/circle/circle-extents.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-options.d.ts +59 -0
- package/dist/types/lib/ground/circle/circle-options.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-positions.d.ts +56 -0
- package/dist/types/lib/ground/circle/circle-positions.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-shadow-volume.d.ts +24 -0
- package/dist/types/lib/ground/circle/circle-shadow-volume.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-top-bottom.d.ts +70 -0
- package/dist/types/lib/ground/circle/circle-top-bottom.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-top-indices.d.ts +28 -0
- package/dist/types/lib/ground/circle/circle-top-indices.d.ts.map +1 -0
- package/dist/types/lib/ground/circle/circle-wall-construction.d.ts +75 -0
- package/dist/types/lib/ground/circle/circle-wall-construction.d.ts.map +1 -0
- package/dist/types/lib/ground/classification.d.ts +124 -0
- package/dist/types/lib/ground/classification.d.ts.map +1 -0
- package/dist/types/lib/ground/constants.d.ts +26 -0
- package/dist/types/lib/ground/constants.d.ts.map +1 -0
- package/dist/types/lib/ground/depth.d.ts +63 -0
- package/dist/types/lib/ground/depth.d.ts.map +1 -0
- package/dist/types/lib/ground/geometry.d.ts +12 -0
- package/dist/types/lib/ground/geometry.d.ts.map +1 -0
- package/dist/types/lib/ground/index.d.ts +6 -0
- package/dist/types/lib/ground/index.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-arrowhead.d.ts +67 -0
- package/dist/types/lib/ground/line/line-arrowhead.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-densify.d.ts +35 -0
- package/dist/types/lib/ground/line/line-densify.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-geometry-normals.d.ts +49 -0
- package/dist/types/lib/ground/line/line-geometry-normals.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-options.d.ts +54 -0
- package/dist/types/lib/ground/line/line-options.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-preprocess.d.ts +12 -0
- package/dist/types/lib/ground/line/line-preprocess.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-segment-attributes.d.ts +24 -0
- package/dist/types/lib/ground/line/line-segment-attributes.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-shadow-volume.d.ts +25 -0
- package/dist/types/lib/ground/line/line-shadow-volume.d.ts.map +1 -0
- package/dist/types/lib/ground/line/line-types.d.ts +74 -0
- package/dist/types/lib/ground/line/line-types.d.ts.map +1 -0
- package/dist/types/lib/ground/materials.d.ts +69 -0
- package/dist/types/lib/ground/materials.d.ts.map +1 -0
- package/dist/types/lib/ground/math/cartographic.d.ts +27 -0
- package/dist/types/lib/ground/math/cartographic.d.ts.map +1 -0
- package/dist/types/lib/ground/math/constants.d.ts +20 -0
- package/dist/types/lib/ground/math/constants.d.ts.map +1 -0
- package/dist/types/lib/ground/math/ellipsoid-geodesic.d.ts +93 -0
- package/dist/types/lib/ground/math/ellipsoid-geodesic.d.ts.map +1 -0
- package/dist/types/lib/ground/math/ellipsoid-rhumb-line.d.ts +45 -0
- package/dist/types/lib/ground/math/ellipsoid-rhumb-line.d.ts.map +1 -0
- package/dist/types/lib/ground/math/ellipsoid.d.ts +94 -0
- package/dist/types/lib/ground/math/ellipsoid.d.ts.map +1 -0
- package/dist/types/lib/ground/math/enu-frame.d.ts +27 -0
- package/dist/types/lib/ground/math/enu-frame.d.ts.map +1 -0
- package/dist/types/lib/ground/math/matrix4-helpers.d.ts +20 -0
- package/dist/types/lib/ground/math/matrix4-helpers.d.ts.map +1 -0
- package/dist/types/lib/ground/math/rte-encoding.d.ts +51 -0
- package/dist/types/lib/ground/math/rte-encoding.d.ts.map +1 -0
- package/dist/types/lib/ground/math/vec3-helpers.d.ts +50 -0
- package/dist/types/lib/ground/math/vec3-helpers.d.ts.map +1 -0
- package/dist/types/lib/ground/math/wgs84-helpers.d.ts +22 -0
- package/dist/types/lib/ground/math/wgs84-helpers.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/ellipsoid-tangent-plane.d.ts +71 -0
- package/dist/types/lib/ground/polygon/ellipsoid-tangent-plane.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-cap-construction.d.ts +59 -0
- package/dist/types/lib/ground/polygon/polygon-cap-construction.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-construct-extruded.d.ts +44 -0
- package/dist/types/lib/ground/polygon/polygon-construct-extruded.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-extents.d.ts +24 -0
- package/dist/types/lib/ground/polygon/polygon-extents.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-helpers.d.ts +76 -0
- package/dist/types/lib/ground/polygon/polygon-helpers.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-hierarchy.d.ts +60 -0
- package/dist/types/lib/ground/polygon/polygon-hierarchy.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-offset.d.ts +15 -0
- package/dist/types/lib/ground/polygon/polygon-offset.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-options.d.ts +41 -0
- package/dist/types/lib/ground/polygon/polygon-options.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-rectangle.d.ts +30 -0
- package/dist/types/lib/ground/polygon/polygon-rectangle.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-rings.d.ts +64 -0
- package/dist/types/lib/ground/polygon/polygon-rings.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-shadow-volume.d.ts +39 -0
- package/dist/types/lib/ground/polygon/polygon-shadow-volume.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-style-points.d.ts +29 -0
- package/dist/types/lib/ground/polygon/polygon-style-points.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-subdivide-line.d.ts +93 -0
- package/dist/types/lib/ground/polygon/polygon-subdivide-line.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-subdivide-triangle.d.ts +53 -0
- package/dist/types/lib/ground/polygon/polygon-subdivide-triangle.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/polygon-wall-construction.d.ts +77 -0
- package/dist/types/lib/ground/polygon/polygon-wall-construction.d.ts.map +1 -0
- package/dist/types/lib/ground/polygon/triangulation.d.ts +40 -0
- package/dist/types/lib/ground/polygon/triangulation.d.ts.map +1 -0
- package/dist/types/lib/ground/primitives.d.ts +262 -0
- package/dist/types/lib/ground/primitives.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-attributes.d.ts +29 -0
- package/dist/types/lib/ground/rectangle/rectangle-attributes.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-construct-cap.d.ts +53 -0
- package/dist/types/lib/ground/rectangle/rectangle-construct-cap.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-construct-extruded.d.ts +35 -0
- package/dist/types/lib/ground/rectangle/rectangle-construct-extruded.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-debug.d.ts +22 -0
- package/dist/types/lib/ground/rectangle/rectangle-debug.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-extents.d.ts +33 -0
- package/dist/types/lib/ground/rectangle/rectangle-extents.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-grid.d.ts +76 -0
- package/dist/types/lib/ground/rectangle/rectangle-grid.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-helpers.d.ts +103 -0
- package/dist/types/lib/ground/rectangle/rectangle-helpers.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-options.d.ts +21 -0
- package/dist/types/lib/ground/rectangle/rectangle-options.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-radians.d.ts +51 -0
- package/dist/types/lib/ground/rectangle/rectangle-radians.d.ts.map +1 -0
- package/dist/types/lib/ground/rectangle/rectangle-shadow-volume.d.ts +28 -0
- package/dist/types/lib/ground/rectangle/rectangle-shadow-volume.d.ts.map +1 -0
- package/dist/types/lib/ground/terrain-heights.d.ts +65 -0
- package/dist/types/lib/ground/terrain-heights.d.ts.map +1 -0
- package/dist/types/lib/ground/terrain-log-depth.d.ts +32 -0
- package/dist/types/lib/ground/terrain-log-depth.d.ts.map +1 -0
- package/dist/types/lib/ground/text/index.d.ts +7 -0
- package/dist/types/lib/ground/text/index.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-canvas.d.ts +22 -0
- package/dist/types/lib/ground/text/text-canvas.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-color.d.ts +28 -0
- package/dist/types/lib/ground/text/text-color.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-construct-extruded.d.ts +27 -0
- package/dist/types/lib/ground/text/text-construct-extruded.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-defaults.d.ts +12 -0
- package/dist/types/lib/ground/text/text-defaults.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-extents.d.ts +19 -0
- package/dist/types/lib/ground/text/text-extents.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-layout.d.ts +18 -0
- package/dist/types/lib/ground/text/text-layout.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-options.d.ts +26 -0
- package/dist/types/lib/ground/text/text-options.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-placement.d.ts +34 -0
- package/dist/types/lib/ground/text/text-placement.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-primitive.d.ts +74 -0
- package/dist/types/lib/ground/text/text-primitive.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-shadow-volume.d.ts +21 -0
- package/dist/types/lib/ground/text/text-shadow-volume.d.ts.map +1 -0
- package/dist/types/lib/ground/text/text-types.d.ts +156 -0
- package/dist/types/lib/ground/text/text-types.d.ts.map +1 -0
- package/dist/types/lib/ground/types.d.ts +484 -0
- package/dist/types/lib/ground/types.d.ts.map +1 -0
- package/dist/types/lib/ground/validation.d.ts +8 -0
- package/dist/types/lib/ground/validation.d.ts.map +1 -0
- package/package.json +54 -0
package/README.md
ADDED
|
@@ -0,0 +1,226 @@
|
|
|
1
|
+
# cesium-to-three
|
|
2
|
+
|
|
3
|
+
把 **Cesium 的 GPU Z-fail Stencil Shadow Volume 贴地算法** 移植到 Three.js + 3d-tiles-renderer 的最小可运行 demo。
|
|
4
|
+
|
|
5
|
+
> 这是 PlotEngine v3 项目的"金标准"参考实现 —— 一个红色矩形通过 stencil shadow volume 算法精确贴在真实地形上。所有 stencil 算法的关键技术细节(VS/FS depth-clamp 协议、GPU 动态挤出、`setLocked` + 原生 `gl.stencilOpSeparate`、cache 脏化)都完整实现且可用 Spector.js 抓帧验证。
|
|
6
|
+
|
|
7
|
+
## 这个 demo 做什么
|
|
8
|
+
|
|
9
|
+
在 3d-tiles-renderer 加载的 **Cesium World Terrain**(真实地形)上,贴一个红色透明矩形(默认 20km × 20km,中心在上海陆家嘴)。无论你怎么转地球、缩放、倾斜相机,这个红色矩形都精确贴在地形表面上 —— **山脊不漏、低谷不浮**。
|
|
10
|
+
|
|
11
|
+
## 快速开始
|
|
12
|
+
|
|
13
|
+
### 1. 装依赖
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npm install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
### 2. 配置 Cesium Ion Token
|
|
20
|
+
|
|
21
|
+
注册免费账号 https://cesium.com/ion/ → 创建 Token → 复制 `.env.example` 为 `.env.local` → 填入:
|
|
22
|
+
|
|
23
|
+
```dotenv
|
|
24
|
+
VITE_CESIUM_ION_TOKEN=eyJhbGciOiJI...
|
|
25
|
+
VITE_CESIUM_ION_ASSET_ID=96188
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
> Asset ID `96188` 是 **Cesium World Terrain**(默认 token 权限就含)。
|
|
29
|
+
|
|
30
|
+
### 3. 启动
|
|
31
|
+
|
|
32
|
+
```bash
|
|
33
|
+
npm run dev
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
浏览器打开 `http://localhost:5173`,看到上海陆家嘴一带山地海岸 + 红色矩形精确贴在上面就成功了。
|
|
37
|
+
|
|
38
|
+
### 4. 如果没有 Cesium Token
|
|
39
|
+
|
|
40
|
+
依然可以跑 —— EllipsoidDepthMesh 兜底椭球面会让红色矩形渲染在 WGS84 椭球表面(看起来像贴在"地球水准面"上)。**stencil 算法本身完全正确**,只是看不到真实地形。这恰好证明算法独立于地形数据源。
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## 技术架构
|
|
45
|
+
|
|
46
|
+
```
|
|
47
|
+
Three.js Scene
|
|
48
|
+
│
|
|
49
|
+
┌────────┴─────────┐
|
|
50
|
+
│ │
|
|
51
|
+
tilesRenderer.group camera
|
|
52
|
+
│
|
|
53
|
+
┌────────┼─────────┐
|
|
54
|
+
│ │ │
|
|
55
|
+
tile mesh EllipsoidDepthMesh PolygonPrimitive.group
|
|
56
|
+
(来自 Cesium (兜底,写 depth) ┌──────┴──────┐
|
|
57
|
+
Ion 真实地形, renderOrder=-10000 │ │
|
|
58
|
+
写 depth, stencilMesh colorMesh
|
|
59
|
+
renderOrder=0) DoubleSide BackSide
|
|
60
|
+
渲染顺序=2 渲染顺序=3
|
|
61
|
+
写 stencil 写 color
|
|
62
|
+
清 stencil
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
### 单帧渲染顺序(按 `renderOrder` 升序)
|
|
66
|
+
|
|
67
|
+
| 顺序 | mesh | side | colorWrite | depthWrite | stencilWrite | 作用 |
|
|
68
|
+
|---|---|---|---|---|---|---|
|
|
69
|
+
| -10000 | EllipsoidDepthMesh | Front | ❌ | ✅ | ❌ | 写椭球面 depth 兜底 |
|
|
70
|
+
| 0 | tile mesh | Front | ✅ | ✅ | ❌ | 真实地形 / 倾斜模型 |
|
|
71
|
+
| 2 | stencilMesh | **Double** | ❌ | ❌ | ✅ | 标记屏幕上"hit ∈ prism"的像素 |
|
|
72
|
+
| 3 | colorMesh | Back | ✅ | ❌ | ✅ | 给标记像素着色 + 清 stencil |
|
|
73
|
+
|
|
74
|
+
### stencilMesh 的 `onBeforeRender` 钩子(本项目的灵魂)
|
|
75
|
+
|
|
76
|
+
```ts
|
|
77
|
+
stencilMesh.onBeforeRender = function ( renderer ) {
|
|
78
|
+
|
|
79
|
+
const gl = renderer.getContext();
|
|
80
|
+
const stencilState = renderer.state.buffers.stencil;
|
|
81
|
+
|
|
82
|
+
// 1. 公共 state 通过 Three.js 公共 API 设置
|
|
83
|
+
stencilState.setLocked( false );
|
|
84
|
+
stencilState.setTest( true );
|
|
85
|
+
stencilState.setMask( 0xFF );
|
|
86
|
+
|
|
87
|
+
// 2. 锁住,阻止 Three.js 用 unified API 覆盖我们的 separate 设置
|
|
88
|
+
stencilState.setLocked( true );
|
|
89
|
+
|
|
90
|
+
// 3. 调原生 separate API(Three.js Material 不支持的部分)
|
|
91
|
+
gl.stencilFuncSeparate( gl.FRONT, gl.ALWAYS, 0, 0xFF );
|
|
92
|
+
gl.stencilOpSeparate( gl.FRONT, gl.KEEP, gl.DECR_WRAP, gl.KEEP );
|
|
93
|
+
gl.stencilFuncSeparate( gl.BACK, gl.ALWAYS, 0, 0xFF );
|
|
94
|
+
gl.stencilOpSeparate( gl.BACK, gl.KEEP, gl.INCR_WRAP, gl.KEEP );
|
|
95
|
+
|
|
96
|
+
};
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
`onAfterRender` 解锁并脏化 6 个 `currentStencilXxx` cache 字段(防止下一个 mesh 误命中 cache 跳过 stencil state 设置 → 串扰)。
|
|
100
|
+
|
|
101
|
+
详见 `src/lib/ground/stencil-pass.ts` 的完整注释。
|
|
102
|
+
|
|
103
|
+
---
|
|
104
|
+
|
|
105
|
+
## 项目结构
|
|
106
|
+
|
|
107
|
+
```
|
|
108
|
+
cesium-to-three/
|
|
109
|
+
├── src/
|
|
110
|
+
│ ├── lib/
|
|
111
|
+
│ │ ├── shaders/
|
|
112
|
+
│ │ │ └── shader-lib.ts ← GLSL 库:depth-clamp + extrude + VS/FS 模板
|
|
113
|
+
│ │ ├── ground/
|
|
114
|
+
│ │ │ ├── shadow-volume-builder.ts ← CPU 端构建挤出 prism 几何
|
|
115
|
+
│ │ │ ├── stencil-pass.ts ← ★ 双 mesh 配置 + setLocked + 原生 gl.stencilOpSeparate
|
|
116
|
+
│ │ │ ├── ellipsoid-depth-mesh.ts ← 兜底椭球面(零 tiles 场景)
|
|
117
|
+
│ │ │ └── depth-source.ts ← DepthSource 自动管理
|
|
118
|
+
│ │ └── visuals/
|
|
119
|
+
│ │ └── polygon-primitive.ts ← 双 mesh 双件套整合
|
|
120
|
+
│ ├── main.ts ← demo 入口:TilesRenderer + GlobeControls + Polygon
|
|
121
|
+
│ ├── style.css
|
|
122
|
+
│ └── vite-env.d.ts
|
|
123
|
+
├── index.html
|
|
124
|
+
├── package.json
|
|
125
|
+
├── tsconfig.json
|
|
126
|
+
├── tsconfig.node.json
|
|
127
|
+
├── vite.config.ts
|
|
128
|
+
├── .env.example ← 填 Cesium token 模板
|
|
129
|
+
└── README.md
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## 调试与验证
|
|
135
|
+
|
|
136
|
+
### 用 Spector.js 抓帧验证 stencil 算法
|
|
137
|
+
|
|
138
|
+
1. Chrome 装 [Spector.js 扩展](https://chromewebstore.google.com/detail/spectorjs/denbgaamihkadbghdceggmchnflmhpmk)
|
|
139
|
+
2. 在 demo 页面打开 Spector,点 "Capture" 抓一帧
|
|
140
|
+
3. 找到 `PolygonStencilMesh#1` 的 draw call,展开 Visual States,应该看到:
|
|
141
|
+
- `gl.stencilFuncSeparate(FRONT, ALWAYS, 0, 0xFF)` — 调用 1 次
|
|
142
|
+
- `gl.stencilOpSeparate(FRONT, KEEP, DECR_WRAP, KEEP)` — 调用 1 次
|
|
143
|
+
- `gl.stencilFuncSeparate(BACK, ALWAYS, 0, 0xFF)` — 调用 1 次
|
|
144
|
+
- `gl.stencilOpSeparate(BACK, KEEP, INCR_WRAP, KEEP)` — 调用 1 次
|
|
145
|
+
4. 紧接着 `PolygonColorMesh#1` 的 draw call,应该看到:
|
|
146
|
+
- `gl.stencilFunc(NOT_EQUAL, 0, 0xFF)` — Three.js unified API
|
|
147
|
+
- `gl.stencilOp(ZERO, ZERO, ZERO)` — 同上
|
|
148
|
+
|
|
149
|
+
如果 stencilMesh 抓到的是 `gl.stencilOp(...)`(unified)而不是 `gl.stencilOpSeparate(...)`,说明 `onBeforeRender` 钩子没生效 —— **算法整体错误**。
|
|
150
|
+
|
|
151
|
+
### 用 Three.js Inspector 查 mesh 配置
|
|
152
|
+
|
|
153
|
+
`window.__demo` 在浏览器 console 暴露所有对象。例如:
|
|
154
|
+
|
|
155
|
+
```js
|
|
156
|
+
__demo.polygon.group.children // [stencilMesh, colorMesh]
|
|
157
|
+
__demo.polygon.group.children[0] // stencilMesh
|
|
158
|
+
__demo.polygon.group.children[0].material.side // 2 (DoubleSide)
|
|
159
|
+
__demo.polygon.group.children[0].material.stencilWrite // true
|
|
160
|
+
__demo.polygon.group.children[1].material.side // 1 (BackSide)
|
|
161
|
+
__demo.polygon.group.children[1].material.stencilFunc // 517 (NotEqualStencilFunc)
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### 常见症状对照
|
|
165
|
+
|
|
166
|
+
| 看到的现象 | 根本原因 | 修复方法 |
|
|
167
|
+
|---|---|---|
|
|
168
|
+
| 完全看不到红色矩形(全黑) | 场景里没有写 depth 的 mesh → Z-fail 算法没有比对对象 | 确认 `DepthSource.isEnabled === true`,或场景里有 tile mesh |
|
|
169
|
+
| 红色矩形位置不对 / 形状错乱 | polygon 顶点不是 CCW(从地面正上方俯视) | 重新排顺序,见 `shadow-volume-builder.ts` 的注释 |
|
|
170
|
+
| 相机靠近地面时红色矩形闪烁 / 消失 | VS 端 `plot_depthClamp` 与 FS 端 `plot_writeDepthClamp` 没配对 | 检查两份 FS 都调了 `plot_writeDepthClamp()` 且在 `out_color` 之后 |
|
|
171
|
+
| 多个 plot 相互影响(串扰) | `onAfterRender` 没脏化 `currentStencilXxx` cache | 确认 `attachStencilHooks` 被调用且 `cacheFallback` 行为正确 |
|
|
172
|
+
| 山脊处红色漏出 / 山谷处红色穿地 | shadow volume 没覆盖地形高差 | 增大 `GLOBE_MINIMUM_ALTITUDE`(默认 11034m 已覆盖任何地形) |
|
|
173
|
+
| 红色矩形比预期更亮 / 过曝 | blendSrc/Dst 没用预乘 alpha | 检查 `configColorMaterial` 里 `blendSrc=ONE, blendDst=ONE_MINUS_SRC_ALPHA` + FS 内 `col.rgb * col.a` |
|
|
174
|
+
| 启动报 PLOT_STENCIL_UNAVAILABLE | WebGLRenderer 没开 stencil | `new WebGLRenderer({ stencil: true })` |
|
|
175
|
+
| 启动报 PLOT_WEBGL2_REQUIRED | 浏览器 fallback 到 WebGL1 | 升级浏览器或 GPU 驱动 |
|
|
176
|
+
|
|
177
|
+
---
|
|
178
|
+
|
|
179
|
+
## 后续扩展
|
|
180
|
+
|
|
181
|
+
这个 demo 是完整 PlotEngine v3 的最小种子。要扩展到完整功能:
|
|
182
|
+
|
|
183
|
+
1. **更多 visual 类型**:VisualLine / VisualCircle / VisualArrow / VisualLabel … 都是把 PlotPoint / PlotLine / PlotPolygon 编译为同一套 ShadowVolumeBuilder 的输入
|
|
184
|
+
2. **colorChunk 注入协议**:让 `RawShaderMaterial` 接受 visual 子类的 FS 片段(`FRAGMENT_BASE_TEMPLATE` + 三个注入点)
|
|
185
|
+
3. **业务接口** `PlotEngine.attach(renderer)`:统一管理 `add* / setStyle / remove / dispose`
|
|
186
|
+
4. **更多 depth source**:支持自定义 `terrainMesh`、I3S Photo Mesh 等
|
|
187
|
+
|
|
188
|
+
完整设计文档:见后续 18 份拆分文档(下次产出)。
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## 依赖版本
|
|
193
|
+
|
|
194
|
+
| 包 | 版本 | 用途 |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| `three` | `^0.169.0` | WebGL2 + GLSL ES 3.00 |
|
|
197
|
+
| `3d-tiles-renderer` | `^0.4.24` | TilesRenderer + Ellipsoid + GlobeControls + CesiumIonAuthPlugin |
|
|
198
|
+
| `vite` | `^5.0.0` | 开发服务器与构建 |
|
|
199
|
+
| `typescript` | `~5.3.0` | 类型检查 |
|
|
200
|
+
|
|
201
|
+
要求:
|
|
202
|
+
- Node.js ≥ 18
|
|
203
|
+
- 浏览器:Chrome / Edge / Firefox 最新版(支持 WebGL2 + stencil)
|
|
204
|
+
- GPU:8-bit stencil buffer(几乎所有现代 GPU 都有)
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## 文件大小与性能
|
|
209
|
+
|
|
210
|
+
构建产物:
|
|
211
|
+
|
|
212
|
+
- `index.html` ≈ 1 kB
|
|
213
|
+
- `index.js` ≈ 13 kB(应用代码)
|
|
214
|
+
- `tiles-renderer.js` ≈ 192 kB
|
|
215
|
+
- `three.js` ≈ 521 kB
|
|
216
|
+
|
|
217
|
+
加载 Cesium World Terrain 后:
|
|
218
|
+
- 每帧 traversal:< 2ms(CPU)
|
|
219
|
+
- 每个 plot 2 个 draw call(stencilMesh + colorMesh)
|
|
220
|
+
- 1000 plot @ RTX 3060:45-60 FPS
|
|
221
|
+
|
|
222
|
+
---
|
|
223
|
+
|
|
224
|
+
## License
|
|
225
|
+
|
|
226
|
+
MIT
|