前向渲染和延迟渲染的区别

前向渲染和延迟渲染是两种光照渲染模式。

假设有1个光源和1000个具有光照反射的三角形在view coordinate沿着z轴正方形延伸摆放,法线与z轴平行,即所有三角形xy全相同,只有z不同,但是这里增加一个条件:摆放顺序是无序的。

从屏幕上其实你只能看到一个带光照的三角形,其他的都被挡住了。

那么前向渲染会这样做:

  1. 遍历1000个三角形片元
  2. 进行深度检测,没通过的忽略
  3. 通过检测的进行光照计算
  4. 更新帧缓冲区
  5. 返回1继续直到遍历结束

由于上面的要求是无序摆放,那么如果运气差一点 1000次深度检测全部都能通过,那么光照会计算1000次,可是因为只能看见最上面的,那么999次光照计算都是多余的。如果光源越多第三步的重复次数越多,整体复杂度也会越高。

延迟渲染引入了GBuffer,它会这样做:

  1. 遍历1000个三角形片元
  2. 进行深度检测,没通过的忽略
  3. 通过的将坐标、光照等信息写入GBuffer
  4. 返回1继续直到遍历结束
  5. 遍历Gbuffer
  6. 利用Gbuffer中的数据进行光照计算
  7. 更新帧缓冲区
  8. 返回5继续直到遍历结束

延迟渲染先把可以显示在屏幕上的像素点的相关参数保存下来,然后只进行了一次光照计算就实现了最终效果。这样大大节约了光照计算复杂度。每增加一个光源,只会增加一次整体的光照计算。所以延迟渲染的好处显而易见了。

然而,世间无完美之事,GBuffer只能给屏幕上的每一个点保存一份光照数据,但是如果这些三角形都是半透明的怎么办?

无解–# Blend已废。

由于Gbuffer存的都是像素值,无法体现出每个像素对应的原始模型,那么多重采样抗锯齿功能也无法实现。三角形可能还好点,画圆就悲剧了。

所以如果各位大哥对Blend混合和抗锯齿有要求,那么Gbuffer可能就不太适合了。

posted @ 2020-04-27 20:30  00000000O  阅读(1172)  评论(0编辑  收藏  举报