0

我只是对延迟着色有一些疑问。我已经到了拥有来自多个渲染目标的颜色、位置、法线和纹理的地步。我的问题与我接下来要做什么有关。为了确保我从纹理中获得了正确的数据,我在屏幕上放置了一个平面并将纹理渲染到该平面上。我不明白的是如何操纵这些纹理,以便最终输出被光照着色。我是否需要渲染占据屏幕的平面或四边形并将所有计算应用到该平面上?如果我这样做,我会有点困惑如何让多个灯光以这种方式工作,因为“平面”将是一个可渲染对象,因此对于每个灯光,我都需要重新渲染平面。我想错了吗?

4

1 回答 1

1

您需要渲染一些几何图形来表示灯光覆盖的区域。光的每个像素的光照项被累积到目标渲染目标中。这为您提供了点亮的结果。

有多种方法可以做到这一点。为了启动和运行,一个简单/容易(而且非常慢)的方法是为每个灯光渲染一个全屏四边形。

基本上:

  • 设置:将所有对象渲染到 g-buffer 中,存储各种对象属性(反照率、镜面反射、法线、深度,无论您需要什么)
  • 照明: 对于每盏灯:
    • 渲染一些几何图形来表示灯光将在屏幕上覆盖的区域
    • 为计算光照贡献所需的数据采样 g-buffer(可以使用 vpos 寄存器查找 uv)
    • 将光照项累积到目标渲染目标中(对于简单的情况,后备缓冲区会做得很好)

一旦你完成了这项工作,有很多不同的方法可以加速它(剪式矩形,紧密绑定灯光的网格,模板测试以避免阴影“浮动”区域,一次绘制多个灯光以及更高级别的技术,如平铺)。

这些天,延迟着色有很多不同的倾向,但这里彻底介绍了原始技术:http: //http.download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf

于 2014-10-20T01:53:22.883 回答