Building a Simple Engine -- Advanced Topics -- Forward+ rendering

Forward+ 保留了开发者所熟悉的前向着色模型,同时将逐像素光照循环的计算范围,限定为可能对当前像素产生影响的光源 。其核心实现逻辑为:将屏幕划分为多个瓦片(tile)(也可按需增加 Z 轴切片),并通过compute pass(计算通道)生成逐瓦片的光源列表。

核心实现流程

  1. 深度预通道(Depth pre-pass,可选):填充深度缓冲区,让计算阶段能更高效地基于 Z 轴进行光源剔除。
  2. 计算通道 :为各瓦片(及切片)分配关联光源,并将精简后的光源列表写入SSBO(着色器存储缓冲区对象)。
  3. 主 PBR 渲染通道:针对每个像素,读取其所属瓦片的头信息,仅遍历该瓦片关联的光源执行光照计算。

代码对应位置

缓冲区、每帧状态与描述符绑定

renderer_compute.cpp、renderer_resources.cpp(可检索ForwardPlusPerFrame 相关数据)

计算调度与每帧参数配置

renderer_rendering.cpp

着色器端的光源列表调用逻辑

shaders/pbr.slang(Forward+ 光照循环相关代码)

开发优化技巧

  1. 合理调整瓦片尺寸:在 1080p 分辨率下,16×16 是性价比较高的默认尺寸。
  2. 若开启了深度预通道,在后续的不透明颜色渲染通道中,需将depthWriteEnable 设为 false、depthCompare设为 Equal。

未来拓展方向

若希望在本精简示例的基础上做深度扩展,可参考以下方向:

  1. 从 2D 瓦片升级为聚类式 Forward+(实现基于深度切片的 3D 聚类,或结合对数 Z 轴优化)。
  2. 在开发构建标识下,新增轻量级的光源「预算监控 UI」与调试可视化功能(如瓦片热度图)。
  3. 新增阴影实现逻辑(可从单方向光阴影贴图入手),并扩展瓦片数据结构,加入带阴影的光源索引。
相关推荐
千里马-horse1 天前
Building a Simple Engine -- Mobile Development -- Conclusion
pipeline·shader·rendering·vulkan
千里马-horse2 天前
Building a Simple Engine -- Mobile Development -- Platform considerations
android·ios·rendering·vulkan
千里马-horse2 天前
Building a Simple Engine -- Mobile Development -- Performance optimizations
shader·内存优化·rendering·纹理优化·vulkan·压缩格式
千里马-horse4 天前
Building a Simple Engine -- Tooling -- Crash minidumps
rendering·vulkan·崩溃处理
千里马-horse5 天前
Building a Simple Engine -- Tooling -- Introduction
pipeline·shader·rendering·vulkan
千里马-horse25 天前
Ray Tracing -- Ray query shadows
c++·rendering·vulkan
千里马-horse1 个月前
Multithreading with Vulkan
shader·rendering·vulkan·vertex·multithreaded
UWA1 个月前
如何使Bloom只局部地作用于特效以提高性能
memory·rendering
千里马-horse1 个月前
Drawing a triangle -- setup -- Instance
vulkan