zoukankan      html  css  js  c++  java
  • 前向渲染和延迟渲染的区别

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

    假设有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可能就不太适合了。

  • 相关阅读:
    PLSQL游标
    SqlHelper助手
    机房重构前奏——三层转七层
    应用运筹管理经济
    C++——宏观把控
    操作系统——宏观把控
    .NET总结一
    深复制与浅复制
    设计模式之结构型
    设计模式之一对多
  • 原文地址:https://www.cnblogs.com/nafio/p/12789848.html
Copyright © 2011-2022 走看看