代码之家  ›  专栏  ›  技术社区  ›  user2826084

(GLSL)同时从不同角度渲染多重过程

  •  2
  • user2826084  · 技术社区  · 12 年前

    我正在编写一个延迟渲染器,我想到了一些事情。渲染将至少在两个过程中完成:首先,我将位置、法线和漫反射+镜面反射颜色渲染为三种不同的纹理。然后我在最后一个过程中组合这些,为每个灯光进行照明,并添加后处理效果以生成最终图像。不过这部分我已经开始工作了。

    问题来了:如何处理阴影?最简单的方法是在一次扫描中为每个活动灯光渲染深度图。因此,这意味着有多少额外的传球就有多少灯光。这似乎破坏了延迟着色在一个过程中完成所有照明的全部目的。

    一个更好的方法是,如果我可以在一次扫描中一起渲染深度图。但这是否可能。。因为从不同的视角渲染场景需要进行与主相机相同的消隐。因此,从每个灯光的角度进行渲染需要与渲染主摄影机视图一样多的场景遍历和顶点缓冲区绑定。所以它相当昂贵。

    但正确的做法是什么?在多个过程中渲染阴影贴图的标准方法是什么?是否真的需要为每个将为场景提供阴影的灯光单独渲染,或者是否有更好更快的方法来计算所有阴影的总和。是否有方法在单个着色器过程中对多个帧缓冲区进行多重透视渲染?

    此外,我认为为每个照明过程绑定两个缓冲区是一个好主意:一个包含先前过程的结果总和,另一个包含像素距离。然后,所有照明过程的乘积将是可以传递到最终渲染过程的阴影强度贴图。

    然后,最终渲染过程仅在整个屏幕上渲染单个四边形,并在其上进行后处理和着色。所以至少是2+1次传球。如果使用8个灯光,则意味着每帧渲染场景10次?

    1 回复  |  直到 12 年前
        1
  •  2
  •   Community Mohan Dere    9 年前

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

    可以使用多个视口扩展和几何体着色器同时渲染到多个阴影贴图。还可以使用实例化和渲染到纹理阵列。 “OpenGLInsights,第19章-具有分层渲染的大量阴影投射灯光”(因为我是同一本书另一章的作者)

    大多数游戏所做的就是实现某种可见性数据结构,这样你就不必绘制那些你知道不可见的东西。这在渲染阴影贴图时非常有用。您可能希望尝试对同一灯光可见的几何体进行分组,并在一个过程中渲染这些灯光的阴影贴图。这样,可以最小化渲染的几何体数量,而不会影响阴影。如果在场景的完全独立区域中通常有带阴影的灯光,则可见性数据结构将比多视口渲染节省的顶点处理时间更重要。

    使用延迟渲染渲染灯光通常不会使用单个全屏四边形完成。延迟着色的主要优点之一是能够定位照明贡献。在最基本的层次上,在可能被灯光照亮的像素上绘制一些几何图形,例如一个小正方形或圆形。然后,只有这些像素的片段着色器才能进行任何昂贵的照明计算。接下来,您可以通过按深度限制碎片来开始更多的剔除。使用表示灯光影响体积形状的网格非常常见。

    一些相关的链接(只是我在谷歌上搜索那些看起来没有特别顺序的东西)。。。

    推荐文章