2014-02-26 63 views
2

我在写一个延迟渲染器,想到几件事情。渲染将至少进行两遍:首先渲染位置,法线和漫反射+高光颜色为三种不同的纹理。然后我在最后一遍合并这些光线,并为每个光线做照明并添加后处理效果以产生最终图像。这部分我虽然工作。(GLSL)渲染多个同时从不同的角度通过

问题在于:如何处理阴影?幼稚的做法是为每个活动光线分别渲染一个深度图。所以这意味着尽可能多的通行证,因为有灯。这似乎击败了延期着色的全部目的,以一次完成所有照明。

如果我可以一次渲染深度图,那么一个更好的方法是。但是,这甚至有可能吗?因为要从不同的角度呈现场景,需要进行与主摄像机相同的剔除。因此,从每个光源的角度渲染需要与呈现主摄像机视图一样多的场景图遍历和顶点缓冲区绑定。所以这是非常昂贵的。

但是,这样做的正确方法是什么?根据多遍渲染阴影贴图的标准方法是什么?是否真的有必要为每个会给场景带来阴影的光线进行单独的渲染,还是有更好更快的方法来计算所有阴影的总和。有没有办法在单个着色器通道中对多个帧缓冲区执行多个透视图渲染?

另外我想这将是一个好主意,为每个照明通道绑定两个缓冲区:一个包含前一遍的结果总和和一个包含像素距离的结果。然后,所有照明过程的产品将成为可传递给最终渲染过程的阴影强度映射。

最终渲染过程只会在整个屏幕上渲染一个单独的四边形,并在其上进行后处理和着色。所以至少有2 + 1次传球。有8个灯光意味着每个画面都要渲染10次?

回答

2

首先,我不喜欢“阴影强度”或结合阴影的想法。阴影是缺乏光。只有在有光的地方才加灯光,而且不需要担心阴影。实际上,这仅仅意味着在应用每个灯光时应用阴影。

可以使用多个视口扩展和几何着色器同时渲染多个阴影贴图。你也可以使用实例化和渲染纹理数组。 “OpenGL Insights,第19章 - 大量渲染阴影投射灯”让人想起(因为我是同一本书中另一章的作者)

大多数游戏做的事情是实现某种可见性数据结构,以便您不必绘制您认为不可见的东西。这在渲染阴影贴图时非常有用。您可能想要考虑将相同灯光可见的几何图形进行分组,并为这些灯光一次渲染阴影贴图。这样可以最大限度地减少不影响阴影的几何体。如果在场景的完全独立区域中大多数灯光都带有阴影,那么可见性数据结构将比使用多个视口渲染保存的顶点处理时间更重要。

具有延迟渲染的渲染灯通常不会使用单个全屏四元组完成。延迟着色的主要优点之一是能够对照明贡献进行本地化。一个非常基本的级别,可以在像素上绘制一些几何图形,这些像素可以由灯光点亮,如小四方形或圆形。然后只有这些像素的片段着色器才会执行任何昂贵的照明计算。接下来,您可以通过深度限制碎片来开始剔除。使用表示光线影响范围的网格很常见。

一些相关的链接(只是我对谷歌搜索的东西,看着没有特定的顺序像样的)...