Forward+ 保留了开发者所熟悉的前向着色模型,同时将逐像素光照循环的计算范围,限定为可能对当前像素产生影响的光源 。其核心实现逻辑为:将屏幕划分为多个瓦片(tile)(也可按需增加 Z 轴切片),并通过compute pass(计算通道)生成逐瓦片的光源列表。
核心实现流程
- 深度预通道(Depth pre-pass,可选):填充深度缓冲区,让计算阶段能更高效地基于 Z 轴进行光源剔除。
- 计算通道 :为各瓦片(及切片)分配关联光源,并将精简后的光源列表写入SSBO(着色器存储缓冲区对象)。
- 主 PBR 渲染通道:针对每个像素,读取其所属瓦片的头信息,仅遍历该瓦片关联的光源执行光照计算。
代码对应位置
缓冲区、每帧状态与描述符绑定
renderer_compute.cpp、renderer_resources.cpp(可检索ForwardPlusPerFrame 相关数据)
计算调度与每帧参数配置
renderer_rendering.cpp
着色器端的光源列表调用逻辑
shaders/pbr.slang(Forward+ 光照循环相关代码)
开发优化技巧
- 合理调整瓦片尺寸:在 1080p 分辨率下,16×16 是性价比较高的默认尺寸。
- 若开启了深度预通道,在后续的不透明颜色渲染通道中,需将depthWriteEnable 设为 false、depthCompare设为 Equal。
未来拓展方向
若希望在本精简示例的基础上做深度扩展,可参考以下方向:
- 从 2D 瓦片升级为聚类式 Forward+(实现基于深度切片的 3D 聚类,或结合对数 Z 轴优化)。
- 在开发构建标识下,新增轻量级的光源「预算监控 UI」与调试可视化功能(如瓦片热度图)。
- 新增阴影实现逻辑(可从单方向光阴影贴图入手),并扩展瓦片数据结构,加入带阴影的光源索引。