11.一个完整的流程

从加载STP文件,到屏幕上看到3D模型完整全流程

以你 OCCT 的测试脚本行为:source perf_test.tcl → 读取Product1.stp,直到窗口显示模型、可以旋转。

STP文件存储的是B‑Rep边界表示模型:只保存数学曲面、曲线、拓扑(面、边、顶点),没有三角形,显卡GPU不能直接渲染STP。

整体完整链路:

  1. STEP文件IO读取与STEP解析(Test0 STEP Load Time)
  2. 构建OCCT内存B‑Rep拓扑几何数据结构
  3. (可选)形状修复 fixshape(Test0b Shape Repair)
  4. 创建AIS交互对象 AIS_Shape,交给交互上下文
  5. 触发网格化 BRepMesh_IncrementalMesh(Mesh Gen),B‑Rep曲面离散成三角形
  6. 网格数据上传GPU显存(VBO/IBO缓冲区)
  7. 第一次视图重绘redraw:CPU准备绘制数据 + OpenGL GPU流水线绘制,屏幕出现模型
  8. 交互旋转缩放:只重复执行重绘流程,不再解析STP、不再网格化

下面逐步骤拆解,每一步干什么、CPU/GPU、对应日志字段、耗时来源。


步骤1:STEP文件IO + STEP解析

硬件:纯CPU,磁盘IO + 解析运算

  1. 磁盘读取 Product1.stp 的文本内容。

  2. OCCT STEP解释器(XSDE_Reader)解析STEP标准的实体:装配结构、零件、颜色、曲面定义、拓扑关系(Face面、Edge边、Vertex顶点)。

  3. 把STEP标准的数据结构转换为OCCT内部几何类:TopoDS_Shape、Geom_Surface、Geom_Curve。

    输出结果:内存中得到完整B‑Rep模型,只有曲面数学公式,没有任何三角形面片。

步骤2:构建内存B‑Rep拓扑结构

解析完成后,在内存构建完整拓扑树:装配、子零件、面集合、边集合。

94万张面,264万条边,这就是这个模型的原始B‑Rep规模。 此时所有面是解析曲面:圆柱面、球面、B样条曲面,不是三角片。

步骤3:【可选】形状修复 fixshape

测试脚本开启了repair=1,执行fixshape。纯CPU运算。 干什么:

  1. 遍历全部拓扑,检查几何缺陷:缝隙、重叠面、边错位、公差不一致、拓扑错误。
  2. 修复拓扑一致性,缝合缝隙,修正坏的几何,输出新的fixed_model。

重点:修复仅仅修正CAD几何拓扑,不会生成网格。后续还要网格化。

步骤4:创建AIS交互对象,放入交互上下文

把B‑Rep形状(原始模型/修复后的fixed_model)包装成AIS_Shape,加入AIS_InteractiveContext。

AIS = Application Interactive Services,OCCT交互层。

  • AIS_Shape保存:指向B‑Rep模型指针、颜色、透明度、可见性、选择模式。

  • 此时还没有网格,没有上传GPU。只是告诉OCCT:“我有一个模型准备要显示”。

    调用display命令的时候才会触发后面网格化逻辑。

步骤5:网格化 BRepMesh_IncrementalMesh【CPU,一次性操作】

调用display触发网格化,完全在CPU运行,这是CAD显示的关键转换步骤。 输入:B‑Rep每一张曲面 + 参数deflection(def=0.1)弦高误差。 干什么:

  1. 遍历模型每一个Face(94万张面)。
  2. 对每一张解析曲面(圆柱、球面、B样条)做离散:把连续数学曲面切成大量小三角形。
  3. deflection=0.1含义:三角形面片距离原始曲面最大允许偏差0.1mm;数值越小网格越密,三角数量越多,CPU耗时暴涨。
  4. 输出:每个面生成顶点数组、三角形索引数组。

⚠️关键点:网格化只发生在第一次display,或者手动修改deflection精度的时候。后续旋转缩放,不会重新跑网格化!

步骤6:网格数据上传到GPU显存 VBO / IBO

网格化完成,CPU得到三角顶点、索引。OCCT把这堆数据拷贝,上传至显卡显存,创建:

  • VBO 顶点缓冲区:保存每个三角顶点坐标、法线;
  • IBO 索引缓冲区:三角形索引。

上传到显存之后,CPU内存里可以选择释放网格副本;绘制直接读显卡显存,不需要CPU重复传递三角数据。 到此为止,准备好了GPU绘制所需要全部三角数据。

步骤7:第一次重绘 redraw,画面输出到屏幕

执行完整渲染流程:CPU端OCCT准备工作 + GPU OpenGL流水线执行绘制。

每一次窗口刷新、旋转、缩放都会跑这套流程。

7‑1 OCCT CPU侧工作(这是OCCT版本之间性能差异的主要来源)

  1. 遍历AIS_InteractiveContext里面所有可见对象。
  2. 视锥裁剪:判断零件是否在相机视口里面,完全不在屏幕的直接跳过不绘制。
  3. 更新相机矩阵(视图矩阵、投影矩阵),模型局部变换矩阵。
  4. 整理材质、光照参数(Phong光照)。
  5. 组织绘制批次,发起OpenGL绘制调用(DrawCall),告诉GPU:绘制显存中哪一批三角形。

7‑2 GPU OpenGL硬件流水线(显卡硬件执行)

  1. 顶点着色器Vertex Shader:每个顶点乘以视图/投影矩阵,3D坐标转为屏幕2D坐标,输出顶点法线。
  2. 光栅化Rasterization:三角形拆解成屏幕上一个个像素片元fragment。
  3. 片元着色器Fragment Shader:执行Phong光照计算,结合光源、法线算出每个像素颜色。你的测试条件shading=phong。
  4. 深度测试Z‑Buffer:处理遮挡关系,被前面物体挡住的像素直接丢弃。
  5. 输出像素颜色,写入帧缓冲,输出显示器,你就看到模型了。

步骤8:交互:鼠标旋转模型(动画FPS测试 Test2B)

当旋转模型:

  1. 不会重读STP,不会修复模型,不会重新网格化!
  2. 仅仅更新相机旋转矩阵,重复步骤7(CPU准备+GPU绘制),不停执行redraw。
  3. FPS:一秒钟可以完成多少次完整redraw。

极简总结记忆(分清哪些只跑一次,哪些每帧跑)

阶段 是否每帧重复 运行位置 关键输出
读取解析STP ❌仅一次 CPU磁盘+解析 B‑Rep拓扑曲面,无三角
fixshape形状修复 ❌仅一次 CPU 修复后的B‑Rep,无三角
BRepMesh网格化 ❌仅一次(改精度才重跑) CPU 三角形顶点索引数组
上传显存VBO ❌仅一次 CPU→GPU 显存存放三角数据
redraw渲染(CPU准备+GPU绘制) ✅每一帧都跑 CPU+GPU 屏幕画面、FPS

很多人混淆网格化和渲染: 网格化是把CAD曲面变成三角片的CPU预处理;渲染redraw是把已经生成好的三角片送到显卡画到屏幕。旋转模型只做后者。

posted @ 2026-08-20 09:23  Drunker•L  阅读(32)  评论(3)    收藏  举报