多边形(Polygons)
一旦能在椭球上绘制折线,下一步就是绘制多边形。
常见例子:邮政区划、州、国家、冰川范围(图 8.1)。
我们把多边形的边界视为闭合折线(line loop)——首尾相连。
11.1 纹理贴图法(Render to Texture)
思路:把多边形“烙”到一张 polygon map 纹理上,再用多重纹理与地形混色。
- 单通道:0 表示外部,>0 表示内部及透明度。
- 多通道或多纹理:支持多种颜色、重叠多边形。
- 优点:
- 自动贴合任意地形;
- 性能与顶点数无关,只与纹理分辨率相关。
- 缺点:
- 前景易锯齿(图 8.2);
- 高分辨率纹理耗内存。
- 应用:Google Earth、ArcGIS Explorer 等。
11.2 基于几何的流水线(Tessellating Polygons)
流程(图 8.3):
- 清理输入
- 三角化(triangulation)
- 细分(subdivision)
- 设定高度(set height)
- 渲染
11.2.1 清理输入
- 去重:首尾及连续重复点。
- 自交检测:将顶点投影到椭球切平面,再做 2D 边交叉测试。
- 统一绕向:
- KML:逆时针
- Shapefile:顺时针
- 按面积符号判定并必要时反转。
建议 不要跳过清理,除非使用自研格式。
11.2.2 三角化(Triangulation)
- 凸多边形:O(n) 扇形剖分。
- 凹多边形:耳裁剪(ear clipping)。
- 简单多边形 ⇒ 必有 n-2 个三角形。
- 先讲 O(n³) 基础版,再优化到 O(n²) / O(nr)。
二维耳裁剪步骤(图 8.6-8.11)
- 建立双向链表
remainingPoints+ 输出索引数组indices。 - 遍历找 耳(三点三角形内无其他点且中间点凸)。
- 剪耳 → 记录三角形 → 移除耳尖 → 继续。
椭球面上的耳裁剪
- 方案 A:把顶点投影到切平面,再用 2D 算法。
- 方案 B:
- 锥内测试(图 8.14):用“无限三棱锥”替代 2D 点-in-triangle。
- 凸尖测试:用叉积与椭球法向量符号判断凸凹。
- 完整实现:
OpenGlobe.Core.EarClippingOnEllipsoid。
三角化结果还能做 点-in-polygon 查询:逐三角形做三平面点积即可。
11.2.3 耳裁剪优化
- 剪耳后仅影响左右邻居 → 用四重链表将 O(n) 找耳降至 O(1)。
- 仅对反射点做包含测试 → O(nr)。
- 空间加速:将反射点放入 AABB 树或网格 → 接近 O(n)。
- 实际地学数据(州、国界线)40-50 % 点为反射点,优化效果显著。
11.2.4 细分(Subdivision)
目的:让三角形真正贴合椭球面(图 8.15)。
- 停止条件:边对应的中心角 ≤ 粒度(如 1°)。
- 实现:
- 用队列/缓存(
unordered_map<Edge,int>)避免重复细分。 - 边中点加入后再分两半并递归。
- 代码见
OpenGlobe.Core.TriangleMeshSubdivision。
- 用队列/缓存(
11.2.5 设定高度
Ellipsoid.ScaleToGeocentricSurface(pos)- 也可提升到 恒定高程(如海平面 + 100 m)。
11.2.6 渲染
- 半透明混合:
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA) - 法线:片元着色器用椭球大地法线。
- 背面剔除:仅当高度为 0 时可开启。
11.2.7 流水线扩展
- 带孔多边形:先连接外环与孔洞,转成简单多边形再剖分。
- LOD:
- 顶点聚簇(vertex clustering)或二次误差度量(QEM)。
- 可在细分前/后生成。
- 顶点缓存优化:重排顶点/索引提高 GPU 命中率。
- 包围体:用边界点快速求球体。
11.3 多边形与地形贴合(Polygons on Terrain)
11.3.1 传统方案及其问题
- 直接贴合地形高程:LOD 变化时易出现“漂浮/下陷”。
- 渲染到纹理(8.1):高分辨率纹理内存大,动态多边形重建慢。
11.3.2 阴影体(Shadow Volumes)方案
核心思想:把多边形 挤出 成一个包围地形的 封闭体积,利用模板缓冲标记“内部”像素,再进行颜色调制(图 8.23)。
阴影体算法回顾
- z-pass:
- 渲染场景(仅环境光)。
- 模板缓冲:
- 正面 +1(深度通过)
- 背面 −1(深度通过)
- 非零模板像素 → 阴影区。
- z-fail:解决摄像机在体积内的情况。
- 深度钳制(depth clamping):防止近平面/远平面裁剪。
用于多边形渲染
- 挤出体积:
- 上盖:多边形沿法线抬升到最大可能高程。
- 下盖:沿反法线下沉到最小高程。
- 侧壁:连接上下盖。
- 渲染流程:
- 正常渲染地形(颜色+深度)。
- 模板缓冲阶段:渲染体积的正反面。
- 最终通道:模板非零处用多边形颜色混合。
- 性能优化:
- 模板阶段只画体积 → 不重复渲染整个场景。
- 同颜色多边形可合并为单屏对齐四边形。
11.3.3 性能与优化
- 填充率瓶颈:地平线视角下体积很大。
- 紧凑包围:用高程网格/四叉树裁剪上下盖。
- 分段体积:按地形高度分多层,减少无效片段。
- GPU 生成:几何着色器直接挤出体积,省去 CPU 内存。
- 远距离替代:摄像机足够远时,用漂浮平面代替体积,减少绘制通道。
小结
| 技术 | 适用场景 | 优缺点 |
|---|---|---|
| 纹理贴图 | 静态、无地形 | 简单、无顶点压力;易锯齿、内存大 |
| 几何流水线 | 通用 | 无锯齿、LOD 易;需 CPU/内存 |
| 阴影体贴合 | 任意地形 | 像素级精确、无分辨率限制;填充率高,实现复杂 |
商用经验(STK/Insight3D):
- 几何流水线用于椭球。
- 阴影体用于地形贴合。
- 多种技术可混合使用,按需求取舍。
1746

被折叠的 条评论
为什么被折叠?



