欢迎光临
我们一直在努力

记录:多边形分格化

1. 多边形分格化的原因:
OpenGL底层的GPU光栅化硬件,只能高效且正确地渲染【简单凸多边形】,GPU对凹/自交多边形的渲染结果是不确定的(可能出现破面、闪烁、完全不显示等问题)。
        【凸多边形:多边形内任意两点的连线,完全落在多边形内部(比如正三角形、正方形)。】
        【凹/自交多边形:多边形内存在两点连线穿出多边形的情况(比如带缺口的三角形、中间挖洞的四边形、五角星)。】

2. 分格化的本质:
在CPU端将【凹/自交多边形】拆成【简单凸多边形】,默认拆分为三角形,GPU能高效、正确的进行光栅化。

3. OSG中多边形分格化对应的工具:osgUtil::Tessellator类继承自osg::Referenced,这意味着可以使用osg::ref_ptr管理内存,无需手动释放。

4. Tessellator拆分的工作节点:
① Tessellator的工作是在光栅化之前的CPU端的几何预处理,基于【环绕数和环绕规则】分析复杂多边形的轮廓顶点顺序,直接确定【有效区域的几何边界】+【凸多边形拆分】+【连续轮廓生成】,生成GPU可识别的几何数据;
② GPU端接收拆分后的凸多边形,直接进行光栅化,无需再判断复杂区域的内外,【把复杂的区域判断提前到CPU端,GPU只做简单的凸多边形光栅化,这正式OSG/OpenGL的性能优化策略。】

5. 关于第4点的连续轮廓生成:
① 桥接边:即用于连接分离轮廓的不可见边,Tessellator会在处理时为外轮廓/内轮廓生成桥接边,将多个独立轮廓连城单一连续的闭合轮廓;
② 带洞多边形的环绕规则为【外环线逆时针,内环线顺时针】,在使用Tessellator工具按照环绕规则传入顶点,Tessellator基于该方向判断有效区域,效率最高,未按环绕规则传入顶点,Tessellator会自动计算并调整轮廓方向,稍耗性能且复杂多边形可能出现识别误差。
③ 最终生成新的顶点集合(含原顶点+桥接边顶点),并自动整理为连续轮廓的顶点顺序。

6. OSG中多边形分格化渲染步骤:
① 创建分格化对象Tessellator tessellator;
② 设置分格化类型;
③ 根据计算的环绕数设置相应的环绕规则。
④ 执行分格化,调用函数retessellatePolygons;

7. 代码:

osg::ref_ptr<osgUtil::Tessellator> tess = new osgUtil::Tessellator();
tess->setTessellationType(osgUtil::Tessellator::TESS_TYPE_GEOMETRY);
tess->setBoundaryOnly(false);
tess->setWindingType(osgUtil::Tessellator::TESS_WINDING_ODD);
tess->retessellatePolygons(*(geom.get()));

① 第二行代码:设置分格化类型为几何体,处理整个 osg::Geometry 对象的所有图元(适合整个 Geometry 都是复杂多边形的场景);
② 第三行代码:
false:生成带内部填充的面;true:仅生成多边形的轮廓线。
③ 第四行代码:
设置环绕规则为奇偶环绕,点的环绕数为奇数时,判定为内部有效区域。

【初学者,后续不断优化……】

赞(0)
未经允许不得转载:171主机测评 » 记录:多边形分格化
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址