延迟阴影-如何合并多个灯光?


9

我从GLSL开始,已经实现了简单的延迟着色,该着色输出带有位置,法线和反照率的G缓冲区。

我还编写了一个简单的点光源着色器。

现在,我为点光源绘制一个球体,输出进入照明缓冲区。

问题是,绘制多个灯光时如何合并灯光缓冲区的结果?

例如,当我使用点光源着色器将第二个光源绘制到光缓冲区时,如何将第一个光源添加到照明缓冲区中的第二个光源。我的意思是,您不能读取和写入相同的输出缓冲区吗?

Answers:


12

附加混合,即glBlendFunc(GL_ONE,GL_ONE)和glEnable(GL_BLEND)。


为此必须禁用深度测试吗?
woojoo666

1
@ woojoo666否。实际上,应在将深度测试设置为不相等的情况下启用它,以便精确匹配前一遍的曲面将通过。如果深度测试处于关闭状态,则曲面将错误地累积来自其后面任何物体的光。:)
内森·里德

嗯,这似乎到底是怎么回事。即使启用深度测试,启用混合功能也会使正面与背面融合。我还需要对深度遮罩做些什么吗?
woojoo666

进行了更多的测试,似乎是绘制顺序很重要(从前到后进行绘制可以使深度测试正常进行,并且仅当面等平面时才进行混合,从后到前使所有内容融合在一起)。有没有一种方法可以不对所有内容进行排序?
woojoo666

2
@ woojoo666啊哈,听起来您是自己解决了。是的,您必须先以不透明的方式放下深度,然后才能使用任何类型的混合。它可以是禁用颜色写入的z-prepass,或者另一种常见方法是在第一遍中进行环境/定向光而不进行混合,然后在以后的遍中添加点/点光源并进行混合。
内森·里德

2

对于我的延迟渲染器,我使用来自g缓冲区的信息将所有灯光聚合到一个灯光渲染目标中,然后在创建最终的后缓冲图像时对该渲染目标进行采样以获取光强度。

所以基本上,我将所有游戏几何图形运行到我的几何图形通道中,以构建g缓冲区。从那里,我将g缓冲区输入到我的light pass着色器。每个灯都使用全屏四边形通过该通道。这样,我的像素着色器可以计算来自g缓冲区的所有可见表面的光强度,然后将它们添加到光渲染目标中。您只需将每个光的光强度添加到光缓冲区中,但要确保将强度从0钳位到1。

处理不同类型的光源(点光源,聚光灯,平行光源)所需要做的只是通过使用恒定缓冲区来指定要执行的照明过程来使光通过更坚固。


是的,问题是-如何添加到灯光渲染目标?使用Nathan Reed建议的alpha混合?因为据我所知,您不能读取和写入相同的输出缓冲区(在这种情况下为轻型缓冲区)。
JBeurer

糟糕,是的。我让输出合并通过加性混合处理。当要为最终图像采样时,是要将值固定为一个值,该值对我来说是表面可以接收的最大可能光强度。从那里您可以根据需要缩放灯光。
卡拉什尼科夫孩子2012年

您如何处理墙壁后面有灯光且不应照亮墙壁另一侧的东西的情况?
jjxtra 2013年

@PsychoDad这就是阴影的领域,这是一个更复杂的话题。:)
内森·里德

0

可能会有比这更好的答案,但是我知道,如果在您的着色器中重复执行第二个光源所需的代码,则可以在单个对象上处理两个光源,而不是一个。它确实需要为第二盏灯增加很多代码,并增加一些多余的接缝,但是我知道它确实可以工作。但是,我确实相信,正如有人希望为您指出的那样,可能会有更优雅的解决方案。


不,那是行不通的。我为每个点光源绘制一个球体。除非第二点光与第一光的影响范围相同,否则将不会绘制第二光。如果为所有点光源绘制一个全屏四边形,则您的方法将起作用,但是,这不是正确的方法,因为全屏四边形用于全局照明。假设我有16个小点光源,即使该像素没有被照亮,这也会迫使我为每个像素穿过它们。通常,我会说每个像素都由一两个灯点亮。如果我有100盏灯怎么办?NO
JBeurer

我说这的主要原因是,如果您仅使用两个或几个照明灯,则可以提供帮助。尤其是如果您要渲染许多对象,则使用混合意味着您需要为每个灯光重新绘制场景,因此,如果您有很多形状,例如一百万,一千万或十亿,则每次绘制的成本都更高。如果您需要大量的灯光,则在着色器中进行操作会导致问题,而如果您需要大量的形状,则进行混合会导致问题。如果两者兼有,则需要找到中间立场,但通常游戏中会有一些灯光和许多物体。
CodeNeko 2012年

不,延迟着色不能那样工作。我只需要绘制一次场景并将相关信息存储在G-Buffer中。然后是每个灯光的影响范围,并将其与灯光缓冲区混合。最后将光缓冲区与颜色缓冲区结合在一起,得到最终的阴影颜色缓冲区。照明计算量不取决于场景复杂度。首先,这是延迟着色的主要优点。
JBeurer

嗯,这更有意义,而且会更好。
CodeNeko 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.