RenderWare 会根据摄像机距离选择合适的 LOD。

1️⃣ 基本概念

  • Atomic(RpAtomic:RenderWare 最小渲染单位,可以理解为一个模型实例。

  • LOD(Level of Detail):根据距离或屏幕占比,选择不同精度的几何体渲染,优化性能。

  • LODAtomic 插件:扩展 RpAtomic,让它支持多套几何数据,并根据距离自动切换。


2️⃣ 常量与类型

 
#define RPLODATOMICMAXLOD 20
  • 每个 Atomic 最多支持 20 个 LOD 几何体。

 
typedef RwInt32 (*RpLODAtomicLODCallBack)( RpAtomic *atomic );
  • 回调函数类型,用于自定义 LOD 选择逻辑。


3️⃣ 插件挂载

 
extern RwBool RpLODAtomicPluginAttach(void);
  • 挂载 LODAtomic 插件。

  • 依赖:Atomic 数据结构必须已经存在。

  • 通常挂载顺序:在世界插件(RpWorldPluginAttach)之后、材质/渲染插件之前。


4️⃣ 设置/获取几何体

 
RpAtomic *RpLODAtomicSetGeometry(RpAtomic *atomic, RwInt32 lodIdx, RpGeometry *geometry); RpGeometry *RpLODAtomicGetGeometry(RpAtomic *atomic, RwInt32 lodIdx);
  • 给某个 Atomic 的某个 LOD 级别设置或获取几何体。

  • lodIdx 范围 0~19(RPLODATOMICMAXLOD-1)。


5️⃣ 当前 LOD 与范围

 
RpAtomic *RpLODAtomicSetCurrentLOD(RpAtomic *atomic, RwInt32 lodIdx); RwInt32 RpLODAtomicGetCurrentLOD(RpAtomic *atomic); RpAtomic *RpLODAtomicSetRange(RpAtomic *atomic, RwReal farRange); RwReal RpLODAtomicGetRange(RpAtomic *atomic);
  • SetCurrentLOD / GetCurrentLOD:手动切换或查询当前 LOD。

  • SetRange / GetRange:设置该 LOD 对应的可见距离,RenderWare 会根据摄像机距离选择合适的 LOD。


6️⃣ 摄像机与回调

 
void RpLODAtomicSetCamera(RwCamera *camera); RpAtomic *RpLODAtomicSetLODCallBack(RpAtomic *atomic, RpLODAtomicLODCallBack callback); RpAtomic *RpLODAtomicSelectLOD(RpAtomic *atomic);
  • 设置当前使用的摄像机。

  • 可为 Atomic 设置自定义 LOD 回调函数(例如特殊规则选择几何)。

  • RpLODAtomicSelectLOD:根据摄像机和范围自动选择最合适的 LOD。


7️⃣ 遍历与渲染挂钩

 
RpAtomic *RpLODAtomicForAllLODGeometries(RpAtomic *atomic, RpGeometryCallBack callback, void *pData); RpAtomic *RpLODAtomicHookRender(RpAtomic *atomic); RpAtomic *RpLODAtomicUnHookRender(RpAtomic *atomic);
  • 遍历某个 Atomic 的所有 LOD 几何体。

  • Hook/Unhook 渲染:可以在渲染管线前后插入自定义处理(比如调试、特殊效果)。


🔹 总结

  • LODAtomic 插件是可选插件,必须挂载在 Atomic 插件之后。

  • 目的是 优化渲染性能:远处用低精度几何,近处用高精度几何。

  • 使用流程大致是:

    1. 挂载插件:RpLODAtomicPluginAttach()

    2. 为每个 Atomic 设置多级几何:RpLODAtomicSetGeometry()

    3. 设置可见距离和摄像机

    4. 在渲染前调用 RpLODAtomicSelectLOD() 自动选择 LOD

posted on 2025-10-08 00:36  lydstory  阅读(0)  评论(0)    收藏  举报

导航