3.4 KiB
3.4 KiB
RenderSceneUtility
命名空间: XCEngine::Rendering
类型: utility header
头文件: XCEngine/Rendering/Extraction/RenderSceneUtility.h
描述: 为 scene extraction 提供相机数据构建、mesh/volume 展开、稳定排序和光照辅助查询等基础 helper。
概览
RenderSceneUtility.h 是 RenderSceneExtractor 的下层规则库。
它把最容易散落在 extractor 里的局部逻辑单独收口,当前主要覆盖四类工作:
- 构建 RenderCameraData
- 展开
VisibleRenderItem - 展开
VisibleVolumeItem - 提供可见排序与光照辅助函数
公开函数
相机与可见项构建
BuildRenderCameraData(...)AppendRenderItemsForGameObject(...)AppendVisibleVolumesForGameObject(...)CollectRenderItemsForEntityIds(...)
稳定排序
CompareVisibleRenderItemsStable(...)CompareVisibleVolumesStable(...)
光照辅助
IsUsableLight(...)IsLightVisibleForCullingMask(...)BuildRenderLightDirection(...)FindMainDirectionalLight(...)
当前实现语义
BuildRenderCameraData()
- 读取相机的世界位置、朝向、clear color、投影参数与 clip plane
- 根据 perspective / orthographic 模式构建投影矩阵
- 写入
view、projection、viewProjection - 同时补
worldRight、worldUp、worldForward与aspectRatio
它不会解析 clearFlags;那部分由 planning 层写进 CameraRenderRequest,再在执行层回写。
AppendRenderItemsForGameObject()
- 仅接受激活且启用的 mesh 物体
- 按 mesh section 展开成多个
VisibleRenderItem - 为每项补
material、renderQueue、cameraDistanceSq、localToWorld - 同时把运行时对象 ID 转成渲染侧
renderObjectId
AppendVisibleVolumesForGameObject()
- 仅接受激活且启用的
VolumeRendererComponent - 要求
VolumeField有效且材质存在 - 生成
VisibleVolumeItem,写入volumeField、material、renderQueue、cameraDistanceSq和localToWorld
排序与光照
CompareVisibleRenderItemsStable(...)与CompareVisibleVolumesStable(...)都按renderQueue和相机距离做稳定比较FindMainDirectionalLight(...)负责找出当前 culling mask 下的主方向光BuildRenderLightDirection(...)统一把组件朝向转换为渲染侧光照方向
设计说明
把这些 helper 独立出来是一个典型的商业引擎做法: 不是为了“拆文件而拆文件”,而是为了让 extractor 保持在“组织一帧数据”的层级,而不是同时背负矩阵约定、排序约定和组件过滤约定。
这样做的收益是:
- 提取逻辑更容易单元测试
RenderSceneExtractor的职责边界更清晰- 新增体积、额外光源、材质排序规则时,不必把所有细节塞回一个大类
当前实现边界
- 仍然直接操作场景组件,还不是完全解耦的 render proxy 阶段。
cameraDistanceSq目前按对象变换位置估算,不使用更精细的 bounds 中心。- 没有 LOD、culling 或 batching。