我正在写一个延迟渲染器,我想到了一些事情。渲染将至少在两次传递中完成:首先我将位置,法线和漫反射+镜面反射颜色渲染为三种不同的纹理。然后我在最后一遍中组合这些并为每个灯光做照明并添加后处理效果以产生最终图像。这部分我工作了。
问题出现了:如何处理阴影?天真的方法是在每个单程中为每个活动光渲染深度图。所以这意味着有许多额外的通行证,因为有灯。这似乎打破了延迟着色的整个目的,即在一次通过中完成所有照明。
如果我可以在一次通过中将深度贴图一起渲染,那么更好的方法就是如此。但这有可能在某种程度上可能吗?因为从不同的角度渲染场景需要进行与主摄像机相同的剔除。因此,从每个光的角度进行渲染需要与渲染主摄像机视图一样多的场景图遍历和顶点缓冲区绑定。所以它相当昂贵。
但是这样做的正确方法是什么?根据多次传递渲染阴影贴图的标准方法是什么?是否真的有必要为每个会为场景提供阴影的光进行单独的渲染,或者是否有更好更快的方法来计算所有阴影的总和。有没有办法在单个着色器传递中对多个帧缓冲区进行多个透视渲染?
另外,我认为为每个光通道绑定两个缓冲区是个好主意:一个包含先前通道的结果总和,另一个包含像素距离。然后,所有光照通道的乘积将是阴影强度图,可以传递到最终渲染通道。
最终的渲染过程只会在整个屏幕上渲染一个四边形,然后进行后处理和着色。所以它至少有2 + 1次传球。而对于8个灯,这意味着每帧渲染场景10次?
答案 0 :(得分:2)
首先,我不喜欢“阴影强度”或阴影组合的想法。阴影缺乏光。只有在有光线的地方添加光线,您无需担心阴影。在实践中,这只是意味着在应用每个灯光时应用阴影。
可以使用多个视口扩展和几何着色器同时渲染到多个阴影贴图。您还可以使用实例化和渲染到纹理数组。 “OpenGL洞察,第19章 - 带有分层渲染的大量阴影投射灯”浮现在脑海中(因为我是同一本书中另一章的作者)
大多数游戏所做的是实现某种可见性数据结构,这样您就不必绘制您知道不可见的内容。渲染阴影贴图时,这非常有用。您可能希望尝试将对相同灯光可见的几何体组合在一起,并在一次传递中为这些灯光渲染阴影贴图。这样,您可以最大限度地减少不影响阴影的渲染几何体。如果您在场景的完全独立区域中大部分都有阴影灯,那么可见性数据结构将比使用多个视口渲染保存的顶点处理时间更重要。
使用延迟渲染渲染灯光通常不是使用单个全屏四边形。延迟着色的主要优点之一是能够本地化照明贡献。在一个非常基本的级别上,在像素可以照亮的像素上绘制一些几何图形,例如小四边形或圆形。然后,只有这些像素的片段着色器才能进行任何昂贵的光照计算接下来,您可以通过深度限制片段来开始剔除。使用表示灯光影响量形状的网格是很常见的。
一些相关的链接(只是我用google搜索看起来不太合适的东西)...