1

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

当涉及到点光源时,它表示要在灯光周围渲染球体,只让那些像素通过光照着色器,这可能会受到灯光的影响。该方法存在一些关于 cullface 和相机位置的问题,此处已详细说明。为了解决这些问题,本教程使用了模板测试。

我怀疑导致我第一个问题的方法的效率:

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

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

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

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

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

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

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

4

2 回答 2

1

我没有阅读全文,但我想我了解这种方法的一般概念。

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

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

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

  4. 你忘了在这里做透视分割

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

于 2014-02-21T17:30:53.393 回答
1

我认为那行不通。使用球体的重点是它们被用作光体积而不仅仅是圆形。我们希望将光照应用于场景中位于光照体积内的那些多边形。随着场景的渲染,深度缓冲区被写入。光体渲染步骤使用此数据来正确应用照明。如果它只是一个圆,即使圆被投影到正确的深度,你也无法知道 A 和 C 是否应该被照亮。

在此处输入图像描述

于 2014-02-21T17:38:27.707 回答