【问题标题】:How to render scene lighted by multiple light sources如何渲染由多个光源照亮的场景
【发布时间】:2024-01-14 00:08:01
【问题描述】:

我想渲染一个由多个灯光照亮的场景。由于灯光数量没有预先定义,我决定逐个渲染灯光。

我的问题是:在我生成多个 RT-Textures 包含由不同灯光照亮的结果之后,我如何将它们组合起来生成最终结果?

一些文章表明灯光是相加的。但是,例如,一个像素在RT-Texture_i 上被light_i 着色color_i。最终的颜色color_1 + color_2 + ... + color_n(根据加法属性)更可能是饱和的,我认为这是不正确的(与现实世界相比)。

编辑:

以下图像由两个光源渲染,一个来自正面,另一个来自顶面(场景)。

前脸灯:

顶面光:

以及最终结果(相加):

在这里,花瓶上的阴影非常不自然。是不是加了两张图片造成的,怎么解决?

PS:本次演示是基于XEffects完成的。

【问题讨论】:

  • How lighting in building games with unlimited number of lights works?。是的,灯光是附加的。饱和度可以通过钳位或使用曝光系数来处理(基于观察区域中光纹理的局部动态范围)。您也可以在 HDR 中渲染并在最终通道中选择它
  • @Spektre 上图,加色光看起来很不自然。有什么问题吗?
  • 我看不到环境光,这可能是您觉得缺少的。您的灯光总和超过1.0 的强度,并且由于您没有 HDR 渲染,因此您的引擎正在夹紧。如果这不是您想要的尝试规范化结果light0 + light1 + ... light(n-1) / n

标签: opengl directx rendering shader light


【解决方案1】:

最终的颜色 color_1 + color_2 + ... + color_n(根据加法属性)更可能饱和,我认为这是不正确的(与现实世界相比)。

这是进行光照的正确方法,是的,结果会饱和,因此如果您使用浮点值进行 r、g、b 计算,请记住将最终值钳制为最大值 1.0f。

此外,应根据与灯光的距离对灯光进行衰减,以减少照明贡献,使用

float attenuation = 1.0 / (1.0 + k * pow(distanceToLight, 2));

其中“k”是根据您的喜好调整的任意衰减因子。

【讨论】: