Skip to content

Deferred rendering

nujuxtsun edited this page Jul 8, 2019 · 3 revisions

延迟渲染没有什么特别好说的, 基本就正常流程. 思考一些老问题: 透明物体的处理, 复杂材质的处理

流程

pass 1 : 绘制gbuffer, gbuffer内容根据实际情况来定, 最基本肯定要输出法线和深度, 通常还会对法线进行压缩.深度可以直接用depthstencilbuffer作为输出纹理.如果是pbr材质,还要输出粗糙度和金属度.

pass 2 : 根据光源绘制light volume, 并进行光照计算

唯一需要注意的是使用light volumes的优化方法, 利用球和圆锥来绘制点光源和聚光灯影响范围内的像素. 具体步骤是

  1. 先给定stencil初始值, 然后设定渲染只绘制depthstencil
  2. 画light volume 正面, 然后 inc stencil
  3. 画light volume 背面, 然后 dec stencil
  4. 使用光照pixelshader来绘制light volume,并进行stencil测试. 小于初始值并且z-test失败,说明在light volume后面, 大于初始值并z-test成功 说明在 light volume前面. 这两种情况直接通过stencil-test 过滤掉

顺便light volumes的绘制可以利用instancing, instance buffer内只需要带上index信息

个人感觉lighting volume的方式适合远处的光源, 比如路灯.这类光源很容易被各个阶段的剔除算法给剔除.

参考

延时渲染流程直接上 learnopengl 挺好 https://learnopengl.com/Advanced-Lighting/Deferred-Shading

这里有个关于light volumes的文章值得一看 https://dqlin.xyz/tech/2018/01/02/stencil/

Clone this wiki locally