11.一个完整的流程
从加载STP文件,到屏幕上看到3D模型完整全流程
以你 OCCT 的测试脚本行为:source perf_test.tcl → 读取Product1.stp,直到窗口显示模型、可以旋转。
STP文件存储的是B‑Rep边界表示模型:只保存数学曲面、曲线、拓扑(面、边、顶点),没有三角形,显卡GPU不能直接渲染STP。
整体完整链路:
- STEP文件IO读取与STEP解析(Test0 STEP Load Time)
- 构建OCCT内存B‑Rep拓扑几何数据结构
- (可选)形状修复 fixshape(Test0b Shape Repair)
- 创建AIS交互对象 AIS_Shape,交给交互上下文
- 触发网格化 BRepMesh_IncrementalMesh(Mesh Gen),B‑Rep曲面离散成三角形
- 网格数据上传GPU显存(VBO/IBO缓冲区)
- 第一次视图重绘redraw:CPU准备绘制数据 + OpenGL GPU流水线绘制,屏幕出现模型
- 交互旋转缩放:只重复执行重绘流程,不再解析STP、不再网格化
下面逐步骤拆解,每一步干什么、CPU/GPU、对应日志字段、耗时来源。
步骤1:STEP文件IO + STEP解析
硬件:纯CPU,磁盘IO + 解析运算
-
磁盘读取 Product1.stp 的文本内容。
-
OCCT STEP解释器(
XSDE_Reader)解析STEP标准的实体:装配结构、零件、颜色、曲面定义、拓扑关系(Face面、Edge边、Vertex顶点)。 -
把STEP标准的数据结构转换为OCCT内部几何类:
TopoDS_Shape、Geom_Surface、Geom_Curve。输出结果:内存中得到完整B‑Rep模型,只有曲面数学公式,没有任何三角形面片。
步骤2:构建内存B‑Rep拓扑结构
解析完成后,在内存构建完整拓扑树:装配、子零件、面集合、边集合。
94万张面,264万条边,这就是这个模型的原始B‑Rep规模。 此时所有面是解析曲面:圆柱面、球面、B样条曲面,不是三角片。
步骤3:【可选】形状修复 fixshape
测试脚本开启了repair=1,执行fixshape。纯CPU运算。 干什么:
- 遍历全部拓扑,检查几何缺陷:缝隙、重叠面、边错位、公差不一致、拓扑错误。
- 修复拓扑一致性,缝合缝隙,修正坏的几何,输出新的
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)弦高误差。 干什么:
- 遍历模型每一个Face(94万张面)。
- 对每一张解析曲面(圆柱、球面、B样条)做离散:把连续数学曲面切成大量小三角形。
- deflection=0.1含义:三角形面片距离原始曲面最大允许偏差0.1mm;数值越小网格越密,三角数量越多,CPU耗时暴涨。
- 输出:每个面生成顶点数组、三角形索引数组。
⚠️关键点:网格化只发生在第一次display,或者手动修改deflection精度的时候。后续旋转缩放,不会重新跑网格化!
步骤6:网格数据上传到GPU显存 VBO / IBO
网格化完成,CPU得到三角顶点、索引。OCCT把这堆数据拷贝,上传至显卡显存,创建:
- VBO 顶点缓冲区:保存每个三角顶点坐标、法线;
- IBO 索引缓冲区:三角形索引。
上传到显存之后,CPU内存里可以选择释放网格副本;绘制直接读显卡显存,不需要CPU重复传递三角数据。 到此为止,准备好了GPU绘制所需要全部三角数据。
步骤7:第一次重绘 redraw,画面输出到屏幕
执行完整渲染流程:CPU端OCCT准备工作 + GPU OpenGL流水线执行绘制。
每一次窗口刷新、旋转、缩放都会跑这套流程。
7‑1 OCCT CPU侧工作(这是OCCT版本之间性能差异的主要来源)
- 遍历AIS_InteractiveContext里面所有可见对象。
- 视锥裁剪:判断零件是否在相机视口里面,完全不在屏幕的直接跳过不绘制。
- 更新相机矩阵(视图矩阵、投影矩阵),模型局部变换矩阵。
- 整理材质、光照参数(Phong光照)。
- 组织绘制批次,发起OpenGL绘制调用(DrawCall),告诉GPU:绘制显存中哪一批三角形。
7‑2 GPU OpenGL硬件流水线(显卡硬件执行)
- 顶点着色器Vertex Shader:每个顶点乘以视图/投影矩阵,3D坐标转为屏幕2D坐标,输出顶点法线。
- 光栅化Rasterization:三角形拆解成屏幕上一个个像素片元fragment。
- 片元着色器Fragment Shader:执行Phong光照计算,结合光源、法线算出每个像素颜色。你的测试条件
shading=phong。 - 深度测试Z‑Buffer:处理遮挡关系,被前面物体挡住的像素直接丢弃。
- 输出像素颜色,写入帧缓冲,输出显示器,你就看到模型了。
步骤8:交互:鼠标旋转模型(动画FPS测试 Test2B)
当旋转模型:
- 不会重读STP,不会修复模型,不会重新网格化!
- 仅仅更新相机旋转矩阵,重复步骤7(CPU准备+GPU绘制),不停执行redraw。
- FPS:一秒钟可以完成多少次完整redraw。
极简总结记忆(分清哪些只跑一次,哪些每帧跑)
| 阶段 | 是否每帧重复 | 运行位置 | 关键输出 |
|---|---|---|---|
| 读取解析STP | ❌仅一次 | CPU磁盘+解析 | B‑Rep拓扑曲面,无三角 |
| fixshape形状修复 | ❌仅一次 | CPU | 修复后的B‑Rep,无三角 |
| BRepMesh网格化 | ❌仅一次(改精度才重跑) | CPU | 三角形顶点索引数组 |
| 上传显存VBO | ❌仅一次 | CPU→GPU | 显存存放三角数据 |
| redraw渲染(CPU准备+GPU绘制) | ✅每一帧都跑 | CPU+GPU | 屏幕画面、FPS |
很多人混淆网格化和渲染: 网格化是把CAD曲面变成三角片的CPU预处理;渲染redraw是把已经生成好的三角片送到显卡画到屏幕。旋转模型只做后者。

浙公网安备 33010602011771号