问题延迟着色

时间:2014-10-20 01:41:28

标签: c++ opengl deferred-shading

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

1 个答案:

答案 0 :(得分:1)

您需要渲染一些几何体来表示光线所覆盖的区域。光的每个像素的照明术语被累积到目的地渲染目标中。这样可以为您提供明亮的效果。

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

基本上:

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

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

这些天Deferred Shading有很多不同的偏斜,但原始技术在这里得到了彻底的介绍:http://http.download.nvidia.com/developer/presentations/2004/6800_Leagues/6800_Leagues_Deferred_Shading.pdf