【Virtual Globe 渲染技术笔记】11 多边形(Polygons)

多边形(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):

  1. 清理输入
  2. 三角化(triangulation)
  3. 细分(subdivision)
  4. 设定高度(set height)
  5. 渲染

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)
  1. 建立双向链表 remainingPoints + 输出索引数组 indices
  2. 遍历找 (三点三角形内无其他点且中间点凸)。
  3. 剪耳 → 记录三角形 → 移除耳尖 → 继续。
椭球面上的耳裁剪
  • 方案 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. 渲染场景(仅环境光)。
    2. 模板缓冲:
      • 正面 +1(深度通过)
      • 背面 −1(深度通过)
    3. 非零模板像素 → 阴影区。
  • z-fail:解决摄像机在体积内的情况。
  • 深度钳制(depth clamping):防止近平面/远平面裁剪。
用于多边形渲染
  • 挤出体积
    • 上盖:多边形沿法线抬升到最大可能高程。
    • 下盖:沿反法线下沉到最小高程。
    • 侧壁:连接上下盖。
  • 渲染流程
    1. 正常渲染地形(颜色+深度)。
    2. 模板缓冲阶段:渲染体积的正反面。
    3. 最终通道:模板非零处用多边形颜色混合。
  • 性能优化
    • 模板阶段只画体积 → 不重复渲染整个场景。
    • 同颜色多边形可合并为单屏对齐四边形。

11.3.3 性能与优化

  • 填充率瓶颈:地平线视角下体积很大。
    • 紧凑包围:用高程网格/四叉树裁剪上下盖。
    • 分段体积:按地形高度分多层,减少无效片段。
  • GPU 生成:几何着色器直接挤出体积,省去 CPU 内存。
  • 远距离替代:摄像机足够远时,用漂浮平面代替体积,减少绘制通道。

小结

技术适用场景优缺点
纹理贴图静态、无地形简单、无顶点压力;易锯齿、内存大
几何流水线通用无锯齿、LOD 易;需 CPU/内存
阴影体贴合任意地形像素级精确、无分辨率限制;填充率高,实现复杂

商用经验(STK/Insight3D):

  • 几何流水线用于椭球。
  • 阴影体用于地形贴合。
  • 多种技术可混合使用,按需求取舍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值