延迟照明|点光源使用圆圈

时间:2014-02-21 17:00:19

标签: opengl 3d game-engine post-processing deferred-rendering

我正在this教程之后在我的OpenGL图形引擎中实现延迟光照机制。它工作正常,我不会遇到麻烦。

当谈到点光源时,它表示在灯光周围渲染球体,只能通过照明着色器传递这些像素,这可能会受到光线的影响。有关cullface和摄像机位置的方法存在一些问题,这些问题已经准确地解释了here。为了解决这些问题,本教程使用了模板测试。

我怀疑这种方法的效率让我想到了第一个问题:

画一个代表光球的圆圈不是更好吗?

无论从哪个角度来看,球体在屏幕上看起来都像一个圆圈。任务是确定圆的屏幕位置和比例。这种方法有三个优点:

  • 没有剔除问题
  • no camereposition-in-lightsphere-issue
  • 效率更高(顶点数量严重减少+无模板测试)

使用这种技术有什么缺点吗?

我的第二个问题涉及实施上述方法。圆圈的中心位置可以像往常一样轻松计算:

vec4 screenpos = modelViewProjectionMatrix * vec4(pos, 1.0);
vec2 centerpoint = vec2(screenpos / screenpos.w);

但现在如何计算生成的圆圈的缩放比例? 它应该取决于距离(相机到光线)以及某种透视图。

2 个答案:

答案 0 :(得分:1)

我没有阅读整篇文章,但我认为我理解这种方法的一般概念。

  1. 无济于事。如果您移动相机以使圆圈位于近平面后面,您仍会遇到问题 - 在这种情况下,不会生成任何碎片,并且灯光会“消失”

  2. 文章中描述的灯光会有明显的衰减 - 这是可以理解的,因为球体或圆圈会有明显的边界。我不会称之为点闪电......

  3. 对我而言,这看起来像是过早的优化...我当然只是渲染整个屏幕,并且几乎像往常一样进行着色,没有特殊情况需要担心。不要忘记所有使用opengl状态和额外绘制操作的操作也会引入开销,并且不清楚哪一个会超过另一个。

  4. 你忘了在这里进行视角划分

  5. 计算缩放比例的最简单方法 - 将球体表面上的点转换为屏幕坐标,并计算矢量长度。它显然是屏幕空间边界上的一个点。

答案 1 :(得分:1)

我认为这不会起作用。使用球体的关键是它们被用作光量而不仅仅是圆圈。我们希望将光照应用于场景中光量范围内的那些多边形。渲染场景时,将写入深度缓冲区。光量渲染步骤使用此数据来正确应用光照。如果它只是一个圆圈,你将无法知道A和C是否应该被照亮,即使圆圈被投射到正确的深度。

enter image description here